Building a Bank with Go - Bristech 2015

67f4a8f2a209a38d7242829947b26ba3?s=47 mattheath
October 15, 2015

Building a Bank with Go - Bristech 2015

Traditionally applications have been built as monoliths; single applications which become larger and more complex over time, which limit our ability to react to change. An example of this is the banking industry where mergers and acquisitions between banks have lead to a patchwork of different systems & technologies that cost billions of dollars per year to maintain. As a result, the pace of innovation in the banking industry has slowed to a crawl.

At Mondo we're building a new kind of bank, a smart bank that belongs in the 21st century. This talk will cover how we’re developing new core banking systems from scratch backed by a microservice platform written in Go, running across multiple data centres using open source frameworks and tools including Docker and Mesos. We'll look at why Go is perfectly suited to this, our architectural decisions, common pitfalls to avoid, and how microservice architectures can vastly increase both the velocity of development teams and the scalability and fault tolerance of our systems.

67f4a8f2a209a38d7242829947b26ba3?s=128

mattheath

October 15, 2015
Tweet

Transcript

  1. 3.
  2. 4.
  3. 5.
  4. 7.
  5. 8.
  6. 9.
  7. 11.
  8. 12.
  9. 13.
  10. 14.
  11. 15.
  12. 17.
  13. 18.
  14. 19.
  15. 23.
  16. 24.
  17. 25.
  18. 35.
  19. 36.
  20. 37.
  21. 49.
  22. 58.
  23. 59.

    SOME
 API SERVICE ONE SERVICE TWO LOAD BALANCER HTTP API

    & ROUTING LAYER DATABASE DATABASE EXTERNAL PROVIDER
  24. 61.
  25. 66.

    func main() { srv := service.Init(service.Config{ Name: "service.account", Description: "Store

    bank accounts", }) srv.AddEndpoints( handler.Create, handler.Read, handler.List, ) srv.Run() }
  26. 67.

    func main() { srv := service.Init(service.Config{ Name: "service.account", Description: "Store

    bank accounts", }) srv.AddEndpoints( handler.Create, handler.Read, handler.List, ) srv.Run() }
  27. 68.

    func main() { srv := service.Init(service.Config{ Name: "service.account", Description: "Store

    bank accounts", }) srv.AddEndpoints( handler.Create, handler.Read, handler.List, ) srv.Run() }
  28. 71.

    func main() { srv := service.Init(service.Config{ Name: "service.account", Description: "boop",

    }) srv.AddEndpoints( handler.Create, handler.Read, handler.List, ) srv.Run() }
  29. 72.

    func main() { srv := service.Init(service.Config{ Name: "service.account", Description: "boop",

    }) srv.AddEndpoints( handler.Create, handler.Read, handler.List, ) srv.Run() }
  30. 73.

    type Server interface { Name() string AddEndpoints(eps ...Endpoint) RemoveEndpoints(eps ...Endpoint)

    Endpoint(name string) (Endpoint, bool) Endpoints() []Endpoint Start(trans transport.Transport) error Run(trans transport.Transport) Stop() Middleware() []ServerMiddleware SetMiddleware([]ServerMiddleware) AddMiddleware(ServerMiddleware) }
  31. 74.

    type Transport interface { Tomb() *tomb.Tomb Ready() <-chan struct{} Listen(serviceName

    string, inbound chan<- request) error StopListening(serviceName string) bool Respond(req request, resp response) error Send(req request, timeout time.Duration) (response, error) }
  32. 75.

    type Transport interface { Tomb() *tomb.Tomb Ready() <-chan struct{} Listen(serviceName

    string, inbound chan<- request) error StopListening(serviceName string) bool Respond(req request, resp response) error Send(req request, timeout time.Duration) (response, error) }
  33. 80.

    package context type Context interface { Deadline() (deadline time.Time, ok

    bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} }
  34. 81.

    package context type Context interface { Deadline() (deadline time.Time, ok

    bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} }
  35. 87.

    mercury Logic Handler Storage libraries SERVICE PROVISIONING SERVICE DISCOVERY CONFIGURATION

    MONITORING AUTHENTICATION AUTHORISATION A/B TESTING STORAGE MESSAGING
  36. 88.
  37. 90.
  38. 92.
  39. 97.
  40. 102.

    PhosphorD Service A Trace Library goroutine chan UDP Service B

    Trace Library goroutine chan UDP PHOSPHOR HOST INSTANCES PUBLISH DASHBOARDS AGGREGATION PERSISTANCE NSQ
  41. 103.
  42. 104.
  43. 105.
  44. 106.
  45. 109.
  46. 112.

    ATM: Thomas Hawk
 IBM System/360: IBM Absorbed: Saxbald Photography Orbital

    Ion Cannon: www.rom.ac Go Gophers: Renee French Control Room: NASA ATM Failure: George Redgrave ATM: Thomas Hawk
 IBM System/360: IBM Absorbed: Saxbald Photography Orbital Ion Cannon: www.rom.ac Go Gophers: Renee French Control Room: NASA ATM Failure: George Redgrave Credits