From d4c06cd18e58660ff2d7eccd943aea8d8bff7f75 Mon Sep 17 00:00:00 2001 From: JasterV Date: Thu, 29 Jul 2021 22:53:36 +0200 Subject: [PATCH] readme update --- README.md | 8 ++++++-- assets/arch_diagram.jpg | Bin 0 -> 27116 bytes 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 assets/arch_diagram.jpg diff --git a/README.md b/README.md index e68ac18..22212ba 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Transactions processor -> Process CSV data representing account transactions and display the accounts data +> Process CSV data representing account transactions and display the accounts +> data ## Dependencies @@ -17,7 +18,8 @@ ## Architecture -This project is based on the [Actor Model](https://www.brianstorti.com/the-actor-model/). +This project is based on the +[Actor Model](https://www.brianstorti.com/the-actor-model/). - Each actor run on its own thread (tokio tasks in this case) - Actors do not share state @@ -35,6 +37,8 @@ action. This actor is responsible for managing an `Account` object and a map of the transactions done on that account. +![architecture diagram](assets/arch_diagram.jpg) + ### Why this architecture? The Actors model offers a simple, clean and scalable way of building concurrent diff --git a/assets/arch_diagram.jpg b/assets/arch_diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff22f54fed37f406b4c89095fa05c0ee2f41c38a GIT binary patch literal 27116 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