flowchart LR subgraph message_search client1[user1] --> |search 'monday'| LB{API GateWay} LB --> SearchService[Search Service] SearchService --> SC[(SearchCache)] SC --> SearchService SearchService --> EC1[(Elasticsearch)] end subgraph message_storage TT[ChatService] --> |enqueue msg| Q[Kafka - partitioned and replicated] subgraph workers W[worker1] WW[worker2] WWW[worker3] end subgraph messageCluster M((Messages Node1)) MM((Messages Node2)) M <--> MM MM <--> M end W --> Q WW --> Q W --> M WW --> MM SS[Sparq Job] --> Q SS --> EC[(Elasticsearch)] end subgraph message_send subgraph clients A[web] B[mobile] end subgraph websocket servers G[Server2] GG[Server1] end A --> |send msg to userB| GG GG --> E[ChatService] E --> EE[(UserServerDB)] EE --> |userB in server2| E E --> G[Server2] E --> |save| D[(Messages)] G --> |msg from userA over websocket| B end
The high level design has all the flows demonstrated.