Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Reaktywne mikrousługi w praktyce - Toruń JUG - 25-01-2017

69 views

Published on

This are slides from my presentation in Polish for Polish Java User Group, Toruń, 25.01.2017.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Reaktywne mikrousługi w praktyce - Toruń JUG - 25-01-2017

  1. 1. Reaktywne mikrousługi w praktyce
  2. 2. O mnie
  3. 3. Inspiracja Systemy komputerowe podlegają prawom fizyki
  4. 4. Life beyond the illusion of present
  5. 5. Life beyond the illusion of present
  6. 6. Iluzja była łatwiejsza ▷ Absolutna spójność jest prostsza ▷ Do pewnego stopnia można ją utrzymać ▷ W pewnym momencie (w pewnej skali) już się nie da
  7. 7. Rozproszone systemy są koniecznością
  8. 8. W Allegro mamy system rozproszony I wszystkie związane z tym problemy...
  9. 9. Reaktywność nas zbawi Reactive Systems Reactive Microservices Reactive Streams Reactive Programming
  10. 10. “Reactive - showing a response to a stimulus Reaktywny - będący reakcją na bodźce zewnętrzne
  11. 11. Reactive System ReactiveManifesto.org
  12. 12. Reaktywna Mikrousługa ▷ Izoluje wszystko ▷ Działa autonomicznie ▷ Robi tylko jedną rzecz, ale dobrze ▷ Zarządza swoim stanem na wyłączność ▷ Jest mobilna ale znajdywalna ▷ Działa asynchronicznie (w komunikacji na zewnątrz i wewnątrz) (*) https://www.lightbend.com/blog/the-6-traits-of-reactive-microservices-isolated-asynchronous-autonomous
  13. 13. “Jedna mikrousługa to nie jest mikrousługa, mikrousługi funkcjonują jako systemy.
  14. 14. “Reactive programming is programming with asynchronous data streams.” Andre Staltz The Introduction to Reactive Programming you’ve been missing
  15. 15. Life beyond the illusion of present
  16. 16. “Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure.” http://www.reactive-streams.org/
  17. 17. http://www.reactive-streams.org/announce-1.0.0
  18. 18. Systemy komputerowe podlegają prawom fizyki
  19. 19. Lagertha Reaktywne zapełnianie wyszukiwarki
  20. 20. Prosta usługa konwertująca dane Event o zmianie (REST) U zupełnienie danych Lagertha (Spring-boot) Usługa zewnętrzna (REST) Usługa zewnętrzna (REST) Konwersja Event o zmianie (REST)
  21. 21. Prosta usługa konwertująca dane?? ▷ AtLeastOneDelivery, ▷ Niestabilność i ostateczna spójność usług zależnych, ▷ Brak wpływu na ilość obsługiwanych zdarzeń (Backpressure)
  22. 22. Reaktywna Mikrousługa ▷ Izoluje wszystko ▷ Działa autonomicznie ▷ Robi tylko jedną rzecz, ale dobrze ▷ Zarządza swoim stanem na wyłączność ▷ Jest mobilna ale znajdywalna ▷ Działa asynchronicznie (w komunikacji na zewnątrz i wewnątrz) (*) https://www.lightbend.com/blog/the-6-traits-of-reactive-microservices-isolated-asynchronous-autonomous
  23. 23. Non-blocking back pressure Systemy komputerowe podlegają prawom fizyki
  24. 24. Pull - oznacza blokowanie Slow Publisher Fast Consumer
  25. 25. Slow Publisher Fast Consumer Pull for data Send result when ready Pull - oznacza blokowanie
  26. 26. Slow Publisher Fast Consumer Consumer wait while blocked Pull - oznacza blokowanie Pull for data Send result when ready
  27. 27. Push - łatwo przeładować Fast Publisher Slow Consumer
  28. 28. Fast Publisher Slow ConsumerPush data until not failing Push - łatwo przeładować
  29. 29. Fast Publisher Slow Consumer Consumer overloaded Push - łatwo przeładować Push data until not failing
  30. 30. Publisher Consumer Non-blocking back pressure Give me 3 more Here you have 3 messages
  31. 31. Fast Publisher Slow Consumer Non-blocking back pressure Not so fast, I’m full Wait, until requested
  32. 32. Slow Publisher Fast Consumer Non-blocking back pressure I’m fast give me more Give you more if have any
  33. 33. Narzędzia i Architektura
  34. 34. Apache Kafka (*) http://kafka.apache.org/documentation.html#introduction
  35. 35. Apache Kafka (*) http://kafka.apache.org/documentation.html#introduction
  36. 36. Reactive Kafka https://github.com/akka/reactive-kafka
  37. 37. Akka-Stream
  38. 38. implicit val actorSystem = ActorSystem("jug") implicit val materializer = ActorMaterializer()
  39. 39. implicit val actorSystem = ActorSystem("jug") implicit val materializer = ActorMaterializer() val kafka = new ReactiveKafka() val publisher = kafka.consume(AllegroOfferKafkaSourceConfig.consumerProperties)
  40. 40. implicit val actorSystem = ActorSystem("jug") implicit val materializer = ActorMaterializer() val kafka = new ReactiveKafka() val publisher = kafka.consume(AllegroOfferKafkaSourceConfig.consumerProperties) Source .fromPublisher(publisher)
  41. 41. implicit val actorSystem = ActorSystem("jug") implicit val materializer = ActorMaterializer() val kafka = new ReactiveKafka() val publisher = kafka.consume(AllegroOfferKafkaSourceConfig.consumerProperties) Source .fromPublisher(publisher) .map { Message(_) }
  42. 42. implicit val actorSystem = ActorSystem("jug") implicit val materializer = ActorMaterializer() val kafka = new ReactiveKafka() val publisher = kafka.consume(AllegroOfferKafkaSourceConfig.consumerProperties) Source .fromPublisher(publisher) .map { Message(_) } .filter { message => message.fragment.cause == "CHANGED" && message.fragment.name == "OFFER" }
  43. 43. implicit val actorSystem = ActorSystem("jug") implicit val materializer = ActorMaterializer() val kafka = new ReactiveKafka() val publisher = kafka.consume(AllegroOfferKafkaSourceConfig.consumerProperties) Source .fromPublisher(publisher) .map { Message(_) } .filter { message => message.fragment.cause == "CHANGED" && message.fragment.name == "OFFER" } .throttle(1, 1 second, 1, ThrottleMode.Shaping) .runForeach(println)
  44. 44. implicit val actorSystem = ActorSystem("jug") implicit val materializer = ActorMaterializer() val kafka = new ReactiveKafka() val publisher = kafka.consume(AllegroOfferKafkaSourceConfig.consumerProperties) Source .fromPublisher(publisher) .map { Message(_) } .filter { message => message.fragment.cause == "CHANGED" && message.fragment.name == "OFFER" } .via { timeConsumingStage() } .throttle(1, 1 second, 1, ThrottleMode.Shaping) .runForeach(println)
  45. 45. Architektura Lagertha (Akka-Stream)
  46. 46. Architektura Lagertha (Akka-Stream) Publish Kafka Stream
  47. 47. Architektura Lagertha (Akka-Stream) Publish Kafka Stream Usługa zewnętrzna (REST) Usługa zewnętrzna (REST) Uzupełnienie danych
  48. 48. Architektura Lagertha (Akka-Stream) Publish Kafka Stream Publish Usługa zewnętrzna (REST) Usługa zewnętrzna (REST) Uzupełnienie danych
  49. 49. implicit val actorSystem = ActorSystem("jug") implicit val materializer = ActorMaterializer() val kafka = new ReactiveKafka() val publisher = kafka.consume(AllegroOfferKafkaSourceConfig.consumerProperties) Source .fromPublisher(publisher) .map { Message(_) } .via { callExternalService() } .map { doConversionHere() } .sendEvent() .commitKafkaOffset
  50. 50. Lagertha żyła w iluzji teraźniejszości
  51. 51. Architektura Lagertha (Akka-Stream) Publish Kafka Stream Publish Usługa zewnętrzna (REST) Usługa zewnętrzna (REST) Uzupełnienie danychSpójność !!!
  52. 52. def apply[In, Out](clientFlowProvider: HttpClientFlowProvider, config: Config) (implicit system: ActorSystem, materializer: Materializer): Graph[UniformFanOutShape[immutable.Seq[ItemsProcessingEntity], immutable.Seq[ItemsProcessingEntity]], NotUsed] = { GraphDSL.create() { implicit b => import GraphDSL.Implicits._ val offerStoreFlow = b.add(requestOfferStore(clientFlowProvider, config)) val partition = b.add(partitionByOfferStoreRespStatus()) val mapBack0 = b.add(mapBackToSeqOfItemsProcessingEntity()) val mapBack1 = b.add(mapBackToSeqOfItemsProcessingEntity()) offerStoreFlow.out ~> partition.in partition.out(0) ~> mapBack0 //success partition.out(1) ~> mapBack1 //failure UniformFanOutShape(offerStoreFlow.in, mapBack0.out, mapBack1.out) } }
  53. 53. Floki Reaktywna ocena jakości oferty
  54. 54. Iluzja teraźniejszości istnieje ale jest opóźniona
  55. 55. HDFS + Ecosystem
  56. 56. Prosta usługa konwertująca dane Dane na HDFS U zupełnienie danych Floki (Batchowy) Dane na HDFS Usługa zewnętrzna (REST) Logika biznesowa Zapisanie na HDFS O cena zdjęcia
  57. 57. Prosta usługa konwertująca dane Dane na HDFS U zupełnienie danych Floki (Batchowy) Dane na HDFS Usługa zewnętrzna (REST) Logika biznesowa Zapisanie na HDFS O cena zdjęcia
  58. 58. Problemy floki batchowego ▷ Zbyt długi czas do oceny zdjęcia od zmiany oferty ▷ Duże zużycie zasobów (executorów sparka) ▷ Nierównomierne zużycie zasobów usługi skorowania
  59. 59. Reactive Floki Dane z Kafki U zupełnienie danych Floki Online Usługa zewnętrzna (REST) Usługa zewnętrzna (REST) Logika biznesowa Zapisanie na Kafkę O cena zdjęcia
  60. 60. Architektura Floki (Akka-Stream) Publish Kafka Stream Publish Usługa zewnętrzna (REST) Uzupełnienie danych Usługa zewnętrzna (REST) Akka-Stream
  61. 61. Architektura Floki (Akka-Stream) Publish Kafka Stream Publish Usługa zewnętrzna (REST) Uzupełnienie danych Usługa zewnętrzna (REST) Akka-Stream
  62. 62. Floki (Akka-Stream) Publish Kafka Stream Publish Usługa zewnętrzna (REST) Uzupełnienie danych Usługa zewnętrzna (REST) Akka-Stream Stores HDFS
  63. 63. Floki (Akka-Stream) Publish Kafka Stream Publish Usługa zewnętrzna (REST) Uzupełnienie danych Usługa zewnętrzna (REST) Akka-Stream Stores HDFS Batch Jobs Take data
  64. 64. Floki (Akka-Stream) Publish Kafka Stream Publish Usługa zewnętrzna (REST) Uzupełnienie danych Usługa zewnętrzna (REST) Akka-Stream Stores HDFS Batch Jobs Take data Compensate
  65. 65. Proces dewelopmentu
  66. 66. Mierzymy
  67. 67. A co z problemami?
  68. 68. Co dalej?
  69. 69. Jeszcze trochę nauki... ▷ Jeszcze nie wiemy (ja i mój zespół), czy kolejne usługi będą reaktywne, ▷ Mamy reaktywną usługę, fajnie byłoby mieć system ▷ Chciałbym budować agregaty danych w locie i sprawdzić jak Akka się do tego nadaje (np. dla wszystkich 60 mln ofert).
  70. 70. Podsumowanie
  71. 71. Wnioski ▷ Reaktywne usługi są bardzo obiecujące, ▷ Jest wysoki próg wejścia, w firmie która pracuje w Javie wiele osób może mieć problem z przestawieniem się, ▷ Reaktywne programowanie mogłoby być prostsze.
  72. 72. Dziękuję Pytania?
  73. 73. Find us: Blog: allegrotech.io Twitter: @allegrotechblog work with us kariera.allegro.pl

×