wie man ein backend-as-a-service entwickelt: lessons learned · wie man ein backend-as-a-service...
TRANSCRIPT
![Page 1: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/1.jpg)
Florian Bücklers
Wie man ein Backend-as-a-Service entwickelt: Lessons Learned
Architecture
![Page 2: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/2.jpg)
Florian Bücklers
CTO & Co-FounderBaqend PlatformSpeed Kit Plugin
Who is talking today?
![Page 3: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/3.jpg)
Backend-as-a-ServiceOverview
Backend-as-a-Service
![Page 4: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/4.jpg)
Backend-as-a-Service Feature Sets
DataStorage
Real-Time
Query,Search
BackendCode
Users,OAuth
FileStorage
AccessControl
API for application
features
Hosting and Delivery
REST API and JS SDK
![Page 5: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/5.jpg)
GET /app.htmlGET /js/main-34da93.jsGET /css/main-9ad7ca3.css
Frontend
![Page 6: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/6.jpg)
GET /app.htmlGET /js/main-34da93.jsGET /css/main-9ad7ca3.css
dash
Compatible with:
![Page 7: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/7.jpg)
GET /app.htmlGET /js/main-34da93.jsGET /css/main-9ad7ca3.css
db.Page.load('main').done(...);
GET /img/pic005.jpgGET /img/pic017.jpgGET /img/pic022.jpg
db.Page.find().descending('published').limit(3).resultList(...);
Frontend
![Page 8: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/8.jpg)
Challenges
• Multi-Tenancy
• Load-Balancing and Horizontal Scaling
• High Availability Deployments
• Rolling Updates without Downtime
• Session Handling and Authorization
![Page 9: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/9.jpg)
Content-Delivery-Network
Scalable DatabasesBackend-as-a-Service API:Data, Queries, User Login, etc.Inclusion of all Web CachesAccess through HTTP
Backend ArchitectureBaqend Cloud
![Page 10: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/10.jpg)
Content-Delivery-NetworkContent-Delivery-Network
Baqend Cloud
on
CDN
on
Backend ArchitectureBaqend Cloud
![Page 11: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/11.jpg)
VarnishHA Proxy Baqend DB Client
ElastiCache S3 Storage
Metadata Files
Client
Logging
ELB
Data
Updates
HTTP/2
Websockets
SSL Route 53DNS
![Page 12: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/12.jpg)
SwarmManager Nimbus Zookeeper
Management and Orchestration Server
Pub/Sub Pub/Sub
Storm Query Matching
Updates UpdatedQuery
![Page 13: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/13.jpg)
DB Client
S3 StorageElastiCache
Metadata FilesELB
Logging
Data
Updates
Websockets
Route 53DNS
Client
BaqendVarnishHA Proxy
HTTP/2
SSL
![Page 14: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/14.jpg)
Client CDN Server
SSL SSL
Persistent ConnectionsFast Handshake
• Warm Backend Connections• Backend Failover• Stale-on-error
• Caching at the Edge• Low Read Latency• Early SSL Termination
Content Delivery Network (CDN)SSL and Caching
![Page 15: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/15.jpg)
Horizontally scalable databases (e.g. “NoSQL”)
Replication
Sharding
Failover
Load-Balancing Auto-scaling Failover
Minimize shared state
Load-Balancer Application Server Database
Load BalancingBest Practices
![Page 16: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/16.jpg)
Application Server Database
Load-Balancingat CDN Edge Nodes
CDN
Baqend
Baqend
BaqendRouting
![Page 17: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/17.jpg)
CDN
Server
SSL
Persistent Connections
App containers often moving / updated• New app servers will be registered• Most load-balancers need a reload (Nginx/HAProxy)• Old connections kept alive and served with old configurationRequests will be sent to removed app servers
Persistent Connections and ContainerizationSSL and CDN
App A v1
App B v2
App B v1Routing
Reconfigure
VarnishHA Proxy
+
![Page 18: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/18.jpg)
DB Client
S3 StorageElastiCache
Metadata FilesELB
Logging
Data
Updates
HTTP/2
Websockets
SSL Route 53DNS
Client
VarnishHA Proxy Baqend
![Page 19: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/19.jpg)
User Baqend
PUT db/posts/{id}User-TokenJSON Object
Database
db.posts.update(…,[Allow-Deny-Conditions])
schema-level ACLChecked via token
object-level ACL
Access ControlAuthorization
![Page 20: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/20.jpg)
Problem: Sessions ↔ Stateless Authorization and Authentication in Distributed Systems
App Server DatabaseCDNClients
Alice
Bob
![Page 21: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/21.jpg)
Solution: Signed TokensStateless Sessions
Alice
Authorization
Authentication
App Server DatabaseCDNClients
![Page 22: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/22.jpg)
Token in DetailCreation Date
590c965e590c978aAAAAABgAAAABgAAAADda0f7ebbf0ba76b66c97432a886d26895ad669ee
1493997150
05.05.17 17:12:30
![Page 23: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/23.jpg)
Token in DetailRenew Time
590c965e590c978aAAAAABgAAAABgAAAADda0f7ebbf0ba76b66c97432a886d26895ad669ee
1493997450
05.05.17 17:17:30
![Page 24: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/24.jpg)
Token in DetailUser ID and Role IDs
590c965e590c978aAAAAABgAAAACgAAAADda0f7ebbf0ba76b66c97432a886d26895ad669ee
User ID: 1
Role ID: 2
Role ID: 3
![Page 25: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/25.jpg)
Token in DetailSignature
590c965e590c978aAAAAABgAAAABgAAAADda0f7ebbf0ba76b66c97432a886d26895ad669ee
HMAC Signature
![Page 26: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/26.jpg)
Access Control in the CDNPermissions at the Edge
ServerClient CDN590c965e590c978aAAAAABgAAAABgAAAADda0…
GET /ProtectedResourceAuthorization:
• Required permissions cached at the edge• Can be checked in VCL (Varnish Configuration Language)• No backend communication at all
Cached
User rights:AAAAAB gAAAAB gAAAAD
Table and object permissions encoded in HTTP headers:Baqend-Bucket-Read-Allow: gAAAAD AAAAB7Baqend-Object-Read-Allow: gAAAAD AAAACC
![Page 27: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/27.jpg)
DB Client
S3 StorageElastiCache
Metadata FilesELB
Logging
Data
Updates
HTTP/2
Websockets
SSL Route 53DNS
Client
VarnishHA Proxy Baqend
![Page 28: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/28.jpg)
• Callable methods
• For microservicesand custom web APIs
Backend CodeTrusted Business Logic
![Page 29: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/29.jpg)
• Handler: OnUpdate, OnDelete, OnInsert, OnValidate
• Node.js code, same SDK
User Baqend
Create Object
function onInsert(DB, obj) {
var post = new DB.Post(
{message : "New Data: " + this.name + "."});
post.save();
}
Database
Backend HandlerHooking Into Updates
![Page 30: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/30.jpg)
How to Schedule App & Node ServerUser Code Isolation & Placement
• Internal access (DB/Storm/Redis/S3)
• Isolation
• Public-only access for user code
• Strong coupling between Node and App server• High throughput
• Low latency
Baqend
Baqend
vs.
Server Server
Server
![Page 31: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/31.jpg)
How to Schedule App & Node ServerContainer Schedulers
AWS ECS
+ Automated Server and Service scheduling
- No Docker network isolation
- Only Spread and Binpack as scheduling strategies
- Service definitions can’t be templated
Kubernetes
+ Automated Service scheduling
+ Complex scheduling strategies
- No network isolation within Pods
Swarm (standalone)
- No Services
+ Custom scheduling strategies
+ All Docker features • Networking
• Isolation
• Resource constraints
![Page 32: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/32.jpg)
Docker
![Page 33: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/33.jpg)
Many Docker Containers on one Host
We are starting 183 Containers
oci runtime error: could not synchronise with container process: could not create session key: disk quota exceeded
Starting the 184th container …
All works as expected
Nope, the disk is not full!
![Page 34: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/34.jpg)
Many Docker Containers on one Host
• Tune the kernel parameters!#https://github.com/docker/docker/issues/22865
sysctl -w kernel/keys/root_maxkeys=1000000
sysctl -w kernel/keys/root_maxbytes=25000000
sysctl -w kernel/keys/maxkeys=1000000
sysctl -w kernel/keys/maxbytes=25000000
• Used by docker for container session handling
• Known issue and fixed in newer distributions/kernels
![Page 35: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/35.jpg)
Docker Swarm & AWSNode Drops
• AWS introduces random network errors occasionally
• Swarm drops a nodeSwarm drops all containers
Status checks will fail, since running containers are missing
• You must live with this behavior, if you run a swarm cluster on AWS!
time="2017-09-23T12:33:48Z" level=info msg="Removed Engine ip-10-0-15-21“time="2017-09-23T12:36:00Z" level=info msg="Registered Engine ip-10-0-15-21 at 10.0.15.21:2375"
![Page 36: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/36.jpg)
Docker Networks
• Containers can be isolated in docker networks
• Docker creates two iptable entries for each pair of containers
• This results in O(n²) iptable entries
Baqend
Adding the 100th container 10 000 rules wait 30s
Adding the 10th container 100 rules wait <1s
…
![Page 37: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/37.jpg)
Docker & EBS VolumesDocker Maintenance vs. EBS Rate-Limiting
• Docker stores all its content in /var/lib/docker• Images
• Volumes
• Containers
• Networks
• Docker writes on EBS Volume per default
• Container creation and removal many IOPS
Causes many creation and removal issues
EBS: Network, rate-limited!
![Page 38: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/38.jpg)
DB Client
S3 StorageElastiCache
Metadata Files
Data
Updates
HTTP/2
Websockets
SSL Route 53DNS
Client
Varnish BaqendHA Proxy
ELB
Logging
![Page 39: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/39.jpg)
Logstash “Perfomance”Streaming Logs
DB ClientData
Baqend
ELB Logstash
HA Proxy
Logs
15% CPU usage
75% CPU usage
• Solution: custom Node.js server 5% CPU usage!
![Page 40: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/40.jpg)
Wrap-Up
• Persistent connections and zero-downtime deployments are tricky
• Sessions should be stateless, to be horizontally scalable
• Docker has powerful tools to isolate untrusted components in a secured infrastructure
• Many Docker issues are caused by wrong defaults
• Test performance of each component of your infrastructure
![Page 41: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/41.jpg)
We are hiring.
Contact us.
Florian Bücklers · [email protected] · www.baqend.com
Frontend DevelopersMobile Developers
Java DevelopersWeb Performance Engineers
![Page 42: Wie man ein Backend-as-a-Service entwickelt: Lessons Learned · Wie man ein Backend-as-a-Service entwickelt: Lessons Learned Architecture. Florian Bücklers CTO & Co-Founder Baqend](https://reader030.vdocuments.site/reader030/viewer/2022040306/5ec8cd280a2ea6008a5feb15/html5/thumbnails/42.jpg)
Florian Bücklers · [email protected] · www.baqend.com
Th. 16:00 Real-Time Databases Explained: WhyMeteor, RethinkDB, Parse and Firebase Don't Scale
Fr. 10:00 Real-Time Anwendungen mit React und React Native entwickeln
Fr. 14:00 AMP, PWAs, HTTP/2 and Service Workers: A new Era of Web Performance?
Questions?
Our other talks: