Learn from my mistakes
Martin Skovbo Faartoft
Lead Engineer @
Slides: ftft.dk/talks/eda
(at the worst possible time)
in no particular order
[Picture of wheel] notes:
[Picture standing on the shoulder of giants] [Pictures library logos] notes: Use MassTransit/Rebus/NServiceBus
public async Task MessageHandler(MyEvent e) { var result = ComplicatedCalculation(e); //crash? await _broker.Publish(result); //crash? }
ReceiveMode.ReceiveAndDelete ReceiveMode.PeekLock
public async Task MessageHandler(MyEvent e) { var result = ComplicatedCalculation(e); await _dbContext.SaveChanges(); //crash? await _broker.Publish(result); }
notes:
public async Task MessageHandler(OrderUpdated e) { await var order = _dbContext.Orders.Find(e.Id); var result = UpdateOrder(order, e); _dbContext.Outbox.Add(result); await _dbContext.SaveChanges(); }
notes:
- doesn't have to be a db write
- distributed transactions
Let the database track changes
public async Task MessageHandler(OrderUpdated e) { await var order = _dbContext.Orders.Find(e.Id); var result = UpdateOrder(order, e); //_dbContext.Outbox.Add(result); await _dbContext.SaveChanges(); }
Let retry deal with it
services.AddKillSwitch(5, true, myClass)
Delivery_Semantics Failure_Semantics Idempotency Dual_Write Change_Data_Capture Two-Phase_Commit Distributed_Transaction Transactional_Outbox Dead-letter Peek-lock Topics Queues Subscriptions Partitioning FIFO LIFO Exactly_once_delivery At_least_once_delivery At_most_once_delivery Exactly_once_processing Two_Generals_problem Failure_Semantics Sync Async Eventual_Consistency Messages Events Commands Prefetch Tombstones Consumer Producer Publisher Subscription Subscriber Duplicate_detection Event-streaming Message_broker MQTT AMQP Event_sourcing