trainspotting transporting: rabbitmq, akka.net, rx, mvi, cycle.js
TRANSCRIPT
TRAINSPOTTING TRASPORTING
FROM SERVICEBUS TO MVICHOOSE ARCHITECTURECHOOSE TRANSPORT
CHOOSE LIFE
Transporting
Profile
.NETC#
javascript
MSSQLRabbitMQMongoDB
бла-бла-бла...
Батюшков ВладSenior .NET Developer
опыт +6 лет
Я Я#
Interactive
О том, что я узнал,решая поставленную задачу.
О ЧЕМ Я РАССКАЖУ
Interactive & Reactive worldServiceBusRabbitMQAkka.NETReactive ExtensionsRxJSMVICycle.js
Интерактивный и реактивный мир
ServiceBusRabbitMQAkka.NET
Reactive ExtensionsRxJSMVI
Cycle.js
Interactive
Эта информацияможет помочь мне и (вам?)
сделать «правильный» выбортехнического решения.
ПОЧЕМУ ЭТО ВАЖНО
Interactive worldИнтерактивный мир
futurice.com/blog/reactive-mvc-and-the-virtual-dom
«Модуль» знает, на какие другие «модули» он оказывает воздействие.
futurice.com/blog/reactive-mvc-and-the-virtual-dom
C
B
A
Интерактивно
Reactive worldРеактивный мир
futurice.com/blog/reactive-mvc-and-the-virtual-dom
«Модуль» знает, какие другие «модули» оказывают воздействие на
него.
futurice.com/blog/reactive-mvc-and-the-virtual-dom
C
B
A
Реактивно
Duality
ДвойственностьDuality
Duality
A(!x) == !B(x)
∃x.!P(x) == !(∀x.P(x))“P не выполняется для некоторого х”
утверждение “P выполняется для всех х” является ложным
∃ и ∀являются двойственными понятиями
Двойственность
!x && !y == ! (x || y)∧ и ∨
конъюнкция AND и дизъюнкция ORявляются двойственными
понятиями
Events & Messages События и сообщения
Message-Driven
C
B
A
События и сообщения
Message-Driven
C
B
A
События и сообщения
Notification Module
EMAIL SMS WEB
Notification Module
Action
Boom!
RabbitMQ
Очередь сообщенийRabbitMQ
Проверено временем
ПРОТИВ
Низкий порог вхождения
Много «фич»
Отличная документация
Время / Опыт
Erlang
ЗА
Время не стоит на месте
Есть проблемы: СЕТЬ
ServiceBusMSMQZeroMQApache ActiveMQApache KafkaMQAmazon SQSIronMQStormMQWindows Azure Queues
Topologies
TopicTopology
vhost:layer3
vhost:layer2
vhost:layer1
RabbitMQ | Layers
E WS
N
E WS
ex-n
ex-d
ex-e
M
M
EE
Определяем
получателей
Формируем
содержимое
Делаем отправку
NODE
RabbitMQ | Node
vhost: layer1
vhost: layer2
vhost: layer3
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
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
RabbitMQ | Network Problem
Проблема №1Сеть 90%
Мониторим сеть между нодами+ Мониторим статус кластера
= Реагируем
Нода выпадает из кластера,при длительной потере соединения.
BriefКратко
Akka.NETМодель акторов
Akka.NET
Единица функциональности.
Получение сообщенийОбработка сообщений (функционал)Пересылка сообщений дочерним акторам
ACTOR
Объект передачи данных между акторами.
Сообщения неизменны (immutable)Принимаются в «Почтовый ящик» актораFIFO
MESSAGE
Иерархическая конфигурация акторов.
Конфигурация и определение функциональных возможностей системы.
ACTOR SYSTEM
Akka.NET это toolkit для построения параллельной, распределенной и отказоустойчивой системы управляемой событиями
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();
Rx
Message-Driven архитектураВысокий уровень абстракцииВысокая производительность(до нескольких миллионов акторов на 1ГБ памяти)
Akka.Remote(TCP or UDP)
Akka.Cluster
Reactive Extensions Реактивные расширения
Rx
Библиотекадля компоновки асинхронных и event-driven программ
с использованием observable-последовательностей и LINQ
Rx
ErikMeijer
LINQRx
IEnumerable vs IObservable Dualty
Двойственность
Duality
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));
RxJSRxJS
Cycle.jsMVI
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.
cycle.js.org
Cycle.js
Andre Staltz egghead.io
cycle.js.org
Q?
Transporting
All slides was inspired by:Cycle.jsReactive MVIRxJS and Cycle.js video coursesReactive ExtensionsAkka.NETRabbitMQServiceBusDuality