42
TRAINSPOTTING TRASPORTING FROM SERVICEBUS TO MVI CHOOSE ARCHITECTURE CHOOSE TRANSPORT CHOOSE LIFE

Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Embed Size (px)

Citation preview

Page 1: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

TRAINSPOTTING TRASPORTING

FROM SERVICEBUS TO MVICHOOSE ARCHITECTURECHOOSE TRANSPORT

CHOOSE LIFE

Page 2: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Transporting

Page 3: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Profile

.NETC#

javascript

MSSQLRabbitMQMongoDB

бла-бла-бла...

Батюшков ВладSenior .NET Developer

опыт +6 лет

Я Я#

Page 4: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Interactive

О том, что я узнал,решая поставленную задачу.

О ЧЕМ Я РАССКАЖУ

Page 5: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Interactive & Reactive worldServiceBusRabbitMQAkka.NETReactive ExtensionsRxJSMVICycle.js

Интерактивный и реактивный мир

ServiceBusRabbitMQAkka.NET

Reactive ExtensionsRxJSMVI

Cycle.js

Page 6: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Interactive

Эта информацияможет помочь мне и (вам?)

сделать «правильный» выбортехнического решения.

ПОЧЕМУ ЭТО ВАЖНО

Page 7: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Interactive worldИнтерактивный мир

Page 8: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

futurice.com/blog/reactive-mvc-and-the-virtual-dom

«Модуль» знает, на какие другие «модули» он оказывает воздействие.

Page 9: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

futurice.com/blog/reactive-mvc-and-the-virtual-dom

C

B

A

Интерактивно

Page 10: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Reactive worldРеактивный мир

Page 11: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

futurice.com/blog/reactive-mvc-and-the-virtual-dom

«Модуль» знает, какие другие «модули» оказывают воздействие на

него.

Page 12: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

futurice.com/blog/reactive-mvc-and-the-virtual-dom

C

B

A

Реактивно

Page 13: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Duality

ДвойственностьDuality

Page 14: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Duality

A(!x) == !B(x)

∃x.!P(x) == !(∀x.P(x))“P не выполняется для некоторого х”

утверждение “P выполняется для всех х” является ложным

∃ и ∀являются двойственными понятиями

Двойственность

!x && !y == ! (x || y)∧ и ∨

конъюнкция AND и дизъюнкция ORявляются двойственными

понятиями

Page 15: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Events & Messages События и сообщения

Page 16: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Message-Driven

C

B

A

События и сообщения

Page 17: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Message-Driven

C

B

A

События и сообщения

Page 18: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Notification Module

EMAIL SMS WEB

Notification Module

Page 19: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Action

Boom!

Page 20: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

RabbitMQ

Очередь сообщенийRabbitMQ

Проверено временем

ПРОТИВ

Низкий порог вхождения

Много «фич»

Отличная документация

Время / Опыт

Erlang

ЗА

Время не стоит на месте

Есть проблемы: СЕТЬ

ServiceBusMSMQZeroMQApache ActiveMQApache KafkaMQAmazon SQSIronMQStormMQWindows Azure Queues

Page 21: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Topologies

TopicTopology

Page 22: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

vhost:layer3

vhost:layer2

vhost:layer1

RabbitMQ | Layers

E WS

N

E WS

ex-n

ex-d

ex-e

M

M

EE

Определяем

получателей

Формируем

содержимое

Делаем отправку

Page 23: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

NODE

RabbitMQ | Node

vhost: layer1

vhost: layer2

vhost: layer3

Page 24: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

A-NODE

RabbitMQ | Nodes

vhost: a-layer1

vhost: a-layer2

vhost: a-layer3

B-NODEvhost: b-layer1

vhost: b-layer2

vhost: b-layer3

C-NODEvhost: c-layer1

vhost: c-layer2

vhost: c-layer3

Page 25: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

A-NODE

RabbitMQ | Cluster

vhost: a-layer1

vhost: a-layer2

vhost: a-layer3

B-NODE

C-NODE

ABCCLUSTER

vhost: c-layer1

vhost: c-layer2

vhost: c-layer3

vhost: b-layer1

vhost: b-layer2

vhost: b-layer3

vhost: a-layer1

vhost: a-layer2

vhost: a-layer3

vhost: c-layer1

vhost: c-layer2

vhost: c-layer3

vhost: b-layer1

vhost: b-layer2

vhost: b-layer3

vhost: a-layer1

vhost: a-layer2

vhost: a-layer3

vhost: c-layer1

vhost: c-layer2

vhost: c-layer3

vhost: b-layer1

vhost: b-layer2

vhost: b-layer3

Page 26: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

RabbitMQ | Network Problem

Проблема №1Сеть 90%

Мониторим сеть между нодами+ Мониторим статус кластера

= Реагируем

Нода выпадает из кластера,при длительной потере соединения.

Page 27: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

BriefКратко

Page 28: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Akka.NETМодель акторов

Page 29: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Akka.NET

Единица функциональности.

Получение сообщенийОбработка сообщений (функционал)Пересылка сообщений дочерним акторам

ACTOR

Объект передачи данных между акторами.

Сообщения неизменны (immutable)Принимаются в «Почтовый ящик» актораFIFO

MESSAGE

Иерархическая конфигурация акторов.

Конфигурация и определение функциональных возможностей системы.

ACTOR SYSTEM

Akka.NET это toolkit для построения параллельной, распределенной и отказоустойчивой системы управляемой событиями

Page 30: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Rx

// Create an (immutable) message type that your actor will respond topublic class Greet{

public Greet(string who) { Who = who; }public string Who { get;private set; }

}// Create the actor classpublic class GreetingActor : ReceiveActor{

public GreetingActor(){

Receive<Greet>(greet => Console.WriteLine("Hello {0}", greet.Who));

}}// Create a new actor system (a container for your actors)var system = ActorSystem.Create("MySystem");// Create your actor and get a reference to it.var greeter = system.ActorOf<GreetingActor>("greeter");// Send a message to the actor.greeter.Tell(new Greet("World"));// This prevents the app from exiting// before the async work is done.Console.ReadLine();

Page 31: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Rx

Message-Driven архитектураВысокий уровень абстракцииВысокая производительность(до нескольких миллионов акторов на 1ГБ памяти)

Akka.Remote(TCP or UDP)

Akka.Cluster

Page 32: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Reactive Extensions Реактивные расширения

Page 33: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Rx

Библиотекадля компоновки асинхронных и event-driven программ

с использованием observable-последовательностей и LINQ

Page 34: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Rx

ErikMeijer

LINQRx

Page 35: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

IEnumerable vs IObservable Dualty

Двойственность

Duality

Page 36: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

public interface IEnumerable<T>{    IEnumerator<T> GetEnumerator();}

public interface IEnumerator<T> : IDisposable{    T Current { get; }    bool MoveNext();}

public interface IObservable<T>{    IDisposable Subscribe(IObserver<T> observer);}

public interface IObserver<T>{    void OnNext(T value);    void OnCompleted();    void OnException(Exception error);}

Pull-коллекция

Предоставляет свое содержимое по запросу: MoveNext() пока не закончатся элементы.

Push-коллекция

Толкает элементы в вашем направлении: подписываемся на выдачу элементов.

var o = Observable.FromEvent<MouseEventArgs>(this, "MouseMove").Take(10);o.Subscribe(x => listBox.Items.Add(string.Format("{0},{1}", x.EventArgs.X, x.EventArgs.Y)));

var l = new List<int> {1, 2, 3};l.ToObservable().Subscribe(x => listBox.Items.Add(x));

Page 37: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

RxJSRxJS

Page 38: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

Cycle.jsMVI

Page 39: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

http://futurice.com/blog/reactive-mvc-and-the-virtual-dom

ModelInput: user interaction events from the Intent.Output: data events.

ViewInput: data events from the Model.Output: a Virtual DOM rendering of the model,and raw user input events (such as clicks, keyboard typing, accelerometer events, etc).

IntentInput: raw user input events from the View.Output: model-friendly user intention events.

Page 40: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

cycle.js.org

Cycle.js

Andre Staltz egghead.io

Page 41: Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js

cycle.js.org

Q?