catalyst
play

Catalyst Ubers Serverless Platform Shawn Burke - Staff Engineer - PowerPoint PPT Presentation

Catalyst Ubers Serverless Platform Shawn Burke - Staff Engineer Uber Seattle Why Serverless? Complexity! Microservices, Languages, Client Libs, Tools Product teams have basic infrastructure needs Stable, consistent app


  1. Catalyst Uber’s Serverless Platform Shawn Burke - Staff Engineer Uber Seattle

  2. Why Serverless? ● Complexity! ○ Microservices, Languages, Client Libs, Tools ○ Product teams have basic infrastructure needs ● Stable, consistent app platform pays huge dividends Abstraction => Simplicity => Leverage ●

  3. Why are we building it? (aka “Why don’t you just use AWS Lambda?”) ● Multi-cloud strategy ● Uber doesn’t run prod on AWS today Performance, extensibility requirements ● ○ New source types ○ Granular visibility/control Integration with existing systems ●

  4. Catalyst Goals ● DEVELOPER FOCUSED: runs on desktop and in prod ● Dramatically simplify the process of delivering business logic Unify disparate systems with common patterns ● Pluggability: Multi-Language (handlers), extensible sources ● ● Minimal hard dependencies on underlying compute & networking ● FAST : < 5ms P99 Catalyst “tax”

  5. End-to-End Experience ● Standardized service layout and execution ● Common coding model across sources types Batteries ARE Included: Config, Logging, Metrics, Dashboards, Crash ● Bucketing, Multi-Datacenter, Telemetry, Capture/Replay, Tracing ● Fun, fast iteration loop: code => test => debug => deploy

  6. Writing Handlers: Go Example type group struct {} func (g *group) HelloWorldHandler( ctx context.Context, rw http.ResponseWriter, req *http.Request ) { rw.Write([]byte(":-)")) } logger := catalyst.Logger(ctx) config := catalyst.Config(ctx) func MyKafkaHandler1(ctx context.Context, msg *myJsonStruct) error { func MyKafkaHandler1(ctx catalyst.Context, msg []byte) error { func MyKafkaHandler1(ctx catalyst.Context, msg string) error { metrics:= catalyst.Metrics(ctx) catalyst.Logger(ctx).Info("[my-kafka-topic] MSGS", log.Int32("len", len(msg))) ctx.Logger().Typed().Info("[my-kafka-topic] MSGS", log.Int32("len", len(msg))) ctx.Logger().Typed().Info("[my-kafka-topic] MSGS", log.Int32("len", len(msg))) return nil return nil return nil } } } func RegisterHandlers(catalyst *catalyst.Registry, g group) { catalyst.Register(chttp.Handler(g.HelloWorldHandler, "/", http.MethodGet)) catalyst.Register(kafka.Handler(MyKafkaHandler1, "my-kafka-topic")) }

  7. Writing Handlers: Java @Group public class Handlers { private static final Logger LOG = LoggerFactory.getLogger(Handlers.class); @Handler @HTTP(path="/", method=Method.GET) public CompletableFuture<String> index(Context ctx) { LOG.info("We just got a message from #{} ", ctx.userHeaders.get("User-Agent")); return CompletableFuture.completedFuture(":-)"); } @Handler @Kafka(topic="my-kafka-topic", consumeGroup="my-cg") public void myTopicMessage(Context ctx, Payload payload) { } }

  8. ● Source: Converts external events to Catalyst messages Glossary ● Worker: Binary containing user code We have the best words. ● Handler : Individual event handler ● Group : N handlers; unit of deployment

  9. Architecture: Runtime/Data Plane Nanny ● Each box is a process - Goal State ● Worker & Sources - Process Lifecycle & Restart ○ Local: Worker from build ○ Production: Worker & Sources from S3 ● Shared Nothing Architecture Sources: Kafka, GRPC, HTTP,etc Worker - Per Event Type GRPC - User Code - Flow Control - Dispatching - Telemetry - Telemetry - Capture/Replay - Heartbeats

  10. manifest.json { catalyst run "group_name": "my_http_demo", "project_name": "examples", Package "runtime": "go", "handlers": [ Worker Binary { Container "name": "http_GET_HelloWorldHandler", Build "source_type": "http", manifest.json "params": { Controller "method": "GET", "path": "/" }, "config": { Nanny ... } }, { HTTP Request "name": "kafka_MyKafkaHandler1", HTTP Source "source_type": "kafka", "params": { "offset": "newest", Worker Binary "topic": "my-kafka-topic", Kafka Message } Kafka Source } ], "built_at": "2017-02-08T14:38:36Z", "platform": "darwin" }`

  11. Anatomy of a Request Manifest Source Worker Frontend External Dispatcher System (Source Author) (Catalyst SDK - Per Language) Handler ID Deserialization Headers Raw Payload GRPC / UDS Backend User Handlers (Catalyst SDK) Metrics & Logging

  12. Architecture: Control Plane Metadata MySQL Registry CLI Bits S3 GRPC Stream (Goal States) Download: Sources & Worker Goal State Nanny/Container RUNNING! (Manifest) Controller Mission Control Request Capacity Warming Pool (Containers)

  13. Catalyst Today ● Written in Go ● Onboarding customers Persistent Containers, “Tax” P99 ~2ms ● Production hardening ● ○ Load testing Testing negative scenarios and failure cases ○ ● Bringing errors and information close to users

  14. Catalyst Tomorrow ● Auto scaling ● Integrated (source-specific) status reporting E.g. report status of underlying Kafka topics ○ ● Advanced scenarios ○ Long-tail handlers ○ SLA-based priority ○ Traffic-based placement Goal: Open Source (no timeline quite yet) ●

  15. Questions? sburke@uber.com

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend