$30 off During Our Annual Pro Sale. View Details »

Microservice architecture, a programming languages perspective

Microservice architecture, a programming languages perspective

Microservice architectures have taken over the industry, and with the rise of cluster schedulers and serverless the envelope is being pushed even further. However while tools like microservices, containers, and schedulers were designed to solve problems associated with the systems of old, they introduce many others like API migrations, service dependencies, and deployment automation. In this talk we will explore these new challenges and see how curiously, these system-level concerns can be tackled with some inspiration from the programming languages community, viewing the world of microservices through the lens of type systems and language runtimes.

Adelbert Chang

July 15, 2019
Tweet

More Decks by Adelbert Chang

Other Decks in Programming

Transcript

  1. Microservice architecture
    A programming languages perspective
    Adelbert Chang
    @adelbertchang
    AI Engineer @ Target

    View Slide

  2. Monolithic architecture

    View Slide

  3. Microservice architecture

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. View Slide

  12. View Slide

  13. val average : float -> float -> float

    View Slide

  14. val average : float -> float -> float
    average "hello" "curryon"

    View Slide

  15. val average : float -> float -> float
    average "hello" "curryon"
    Error: This expression has type string but an
    expression was expected of type float

    View Slide

  16. View Slide

  17. Give me a JSON object
    with a "name" field.

    View Slide

  18. Give me a JSON object
    with a "name" field.
    {
    "name": "Adelbert"
    }

    View Slide

  19. Give me a JSON object
    with a "name" field.
    {
    "name": "Adelbert"
    }

    View Slide

  20. View Slide

  21. {
    "name": "Heather"
    }

    View Slide

  22. {
    "name": "Heather"
    }
    "missing field
    `age`", line: 1,
    column: 20

    View Slide

  23. {
    "name": "Heather"
    }
    "missing field
    `age`", line: 1,
    column: 20

    View Slide

  24. View Slide

  25. Deployment service

    View Slide

  26. Deployment service

    View Slide

  27. Deployment service

    View Slide

  28. Deployment service

    View Slide

  29. Deployment service

    View Slide

  30. Deployment service

    View Slide

  31. Deployment service

    View Slide

  32. Deployment service

    View Slide

  33. What we need

    View Slide

  34. What we need

    View Slide

  35. What we need
    Language runtime Deployment service

    View Slide

  36. What we need
    Language runtime Deployment service
    Creating an object Deploying a service

    View Slide

  37. What we need
    Language runtime Deployment service
    Creating an object Deploying a service
    Reference tracking Service dependencies

    View Slide

  38. What we need
    Language runtime Deployment service
    Creating an object Deploying a service
    Reference tracking Service dependencies
    Garbage collection Deprecating legacy services

    View Slide

  39. What we need
    Language runtime Deployment service
    Creating an object Deploying a service
    Reference tracking Service dependencies
    Garbage collection Deprecating legacy services
    Type safety Schema checking and evolution

    View Slide

  40. Deployment runtime

    View Slide

  41. Deployment runtime

    View Slide

  42. Deployment runtime

    View Slide

  43. Deployment runtime

    View Slide

  44. Deployment runtime

    View Slide

  45. Deployment runtime

    View Slide

  46. Deployment runtime

    View Slide

  47. Deployment runtime

    View Slide

  48. Deployment runtime

    View Slide

  49. Deployment runtime

    View Slide

  50. Deployment runtime

    View Slide

  51. Deployment runtime

    View Slide

  52. Deployment runtime

    View Slide

  53. Deployment runtime

    View Slide

  54. Deployment runtime

    View Slide

  55. Deployment runtime

    View Slide

  56. Deployment runtime

    View Slide

  57. Deployment runtime

    View Slide

  58. Deployment runtime

    View Slide

  59. Deployment runtime

    View Slide

  60. Deployment runtime

    View Slide

  61. Deployment runtime

    View Slide

  62. Deployment runtime

    View Slide

  63. Deployment runtime

    View Slide

  64. Deployment runtime

    View Slide

  65. Deployment runtime

    View Slide

  66. Deployment runtime

    View Slide

  67. Deployment runtime

    View Slide

  68. Deployment runtime

    View Slide

  69. Deployment runtime

    View Slide

  70. Deployment runtime

    View Slide

  71. Deployment runtime

    View Slide

  72. Deployment runtime

    View Slide

  73. Deployment runtime

    View Slide

  74. Deployment runtime

    View Slide

  75. Deployment runtime

    View Slide

  76. Deployment runtime

    View Slide

  77. Deployment runtime
    Load balancer

    View Slide

  78. Deployment runtime
    Load balancer

    View Slide

  79. Deployment runtime
    Load balancer

    View Slide

  80. Deployment runtime
    Load balancer

    View Slide

  81. https://getnelson.io/

    View Slide

  82. {
    "name": "Heather"
    }
    "missing field
    `age`", line: 1,
    column: 20

    View Slide

  83. View Slide

  84. syntax = "proto3";
    message Person {
    string name = 1;
    uint32 age = 2;
    }

    View Slide

  85. syntax = "proto3";
    message Person {
    string name = 1;
    uint32 age = 2;
    }
    protoc --java_out=./java --python_out=./python person.proto

    View Slide

  86. syntax = "proto3";
    message Person {
    string name = 1;
    uint32 age = 2;
    }
    public static final class Person extends
    com.google.protobuf.GeneratedMessageV3 implements
    // @@protoc_insertion_point(message_implements:Person)
    PersonOrBuilder {
    protoc --java_out=./java --python_out=./python person.proto

    View Slide

  87. syntax = "proto3";
    message Person {
    string name = 1;
    uint32 age = 2;
    }
    public static final class Person extends
    com.google.protobuf.GeneratedMessageV3 implements
    // @@protoc_insertion_point(message_implements:Person)
    PersonOrBuilder {
    Person = _reflection.GeneratedProtocolMessageType(
    'Person',
    (_message.Message,),
    dict(
    DESCRIPTOR = _PERSON,
    __module__ = 'person_pb2'
    # @@protoc_insertion_point(class_scope:Person)
    ))
    _sym_db.RegisterMessage(Person)
    protoc --java_out=./java --python_out=./python person.proto

    View Slide

  88. Request schema
    Response schema

    View Slide

  89. Schema evolution
    Taken from https://docs.confluent.io/current/schema-registry/avro.html

    View Slide

  90. Schema evolution
    Taken from https://docs.confluent.io/current/schema-registry/avro.html

    View Slide

  91. Compatibility type Changes allowed Upgrade first
    Schema evolution
    Taken from https://docs.confluent.io/current/schema-registry/avro.html

    View Slide

  92. Compatibility type Changes allowed Upgrade first
    Backwards
    • Delete fields

    • Add optional fields
    Consumers
    Schema evolution
    Taken from https://docs.confluent.io/current/schema-registry/avro.html

    View Slide

  93. Compatibility type Changes allowed Upgrade first
    Backwards
    • Delete fields

    • Add optional fields
    Consumers
    Forwards
    • Add fields

    • Delete optional fields
    Producers
    Schema evolution
    Taken from https://docs.confluent.io/current/schema-registry/avro.html

    View Slide

  94. Compatibility type Changes allowed Upgrade first
    Backwards
    • Delete fields

    • Add optional fields
    Consumers
    Forwards
    • Add fields

    • Delete optional fields
    Producers
    Full • Modify optional fields Any
    Schema evolution
    Taken from https://docs.confluent.io/current/schema-registry/avro.html

    View Slide

  95. View Slide

  96. View Slide

  97. Related work
    • Nelson https://getnelson.io/
    • Unison http://unisonweb.org/posts/
    • Lasp https://lasp-lang.readme.io/
    • Partisan http://partisan.cloud/
    • Orleans https://dotnet.github.io/orleans/

    View Slide

  98. EOF

    View Slide