Xu-Mj / sandcat-backend

im app backend
MIT License
75 stars 11 forks source link

this is not a issue, it's my thought about im #35

Open blueeyezhy opened 1 month ago

blueeyezhy commented 1 month ago

大佬您好,im架构上利用kafka配置2个topic,一个用来处理客户端进来的msg,一个用来处理服务端出去的msg,平台架构会不会更简单,实现起来更容易?

ws微服务包含 3个模块:websocket manager (管理客户端 websocket);kafka “in” topic的生产者(将所有进来的销售,发给kafka > broker);kafka “out”topic的消费者(从kafka out topic消费消息,发给websocket manager)

chat微服务包含 3 个模块:kafka “in” topic的消费者(从 “in”topic 消费销售); 消息处理(将消息按照收件人(单人或者group)进行> 拆分重新打包成 msgs,然后grpc给 db微服务保存,同时转给 kafka “out” topic的生产者);kafka “out” topic的生产者将msg 发给 > kafka broker

每个消息 由客户端 指定一个 uuid,跟踪该消息的状态(sending,sent,arrived,read),不用mongo,只用pg和消息状态,跟踪送 > 达,已读,未读,消息同步

blueeyezhy commented 1 month ago

sequenceDiagram
autonumber
    box lightyellow frontend <br/> ios/androd <br/> win/web
    participant clients
    end
    box lightyellow backend <br/> grpc micro services
    participant ws_svc
    participant kafka_br
    participant chat_svc
    participant db_svc
    participant postgres
    participant service_center 

    end

    note over clients,postgres: message loop

    rect rgb(191,239,255)
    note over clients,ws_svc: web socket (incoming msg)
    clients ->>+ ws_svc: msg
    note over kafka_br,ws_svc: kafka in_topic produce 
    ws_svc ->>+ kafka_br: msg
    ws_svc ->>- clients: ack("Sent")
    end

    rect rgb(191,239,255)
    note over kafka_br,chat_svc: kafka in_topic consume
    kafka_br ->>+ chat_svc: msg
    chat_svc ->>+ db_svc: msgs parsed
    db_svc ->>+ postgres: msgs
    postgres ->>- db_svc: ack
    db_svc ->>- chat_svc : ack
    note over kafka_br,chat_svc: kafka out_topic produce
    chat_svc ->>- kafka_br: msgs parsed
    end

    rect rgb(191,239,255)
    note over kafka_br,ws_svc: kafka out_topic consume
    kafka_br ->>+ ws_svc: msg
    note over clients,ws_svc: web socket (outgoing msg)
    ws_svc ->>+ clients: msg
    clients ->>- ws_svc: ack("Arrived")
    end

    note over clients,service_center : grpc request & response
blueeyezhy commented 1 month ago

im2.png…

Xu-Mj commented 1 month ago
sequenceDiagram
autonumber
  box lightyellow frontend <br/> ios/androd <br/> win/web
  participant clients
  end
  box lightyellow backend <br/> grpc micro services
  participant ws_svc
  participant kafka_br
  participant chat_svc
  participant db_svc
  participant postgres
  participant service_center 

  end

  note over clients,postgres: message loop

  rect rgb(191,239,255)
  note over clients,ws_svc: web socket (incoming msg)
  clients ->>+ ws_svc: msg
  note over kafka_br,ws_svc: kafka in_topic produce 
  ws_svc ->>+ kafka_br: msg
  ws_svc ->>- clients: ack("Sent")
  end

  rect rgb(191,239,255)
  note over kafka_br,chat_svc: kafka in_topic consume
  kafka_br ->>+ chat_svc: msg
  chat_svc ->>+ db_svc: msgs parsed
  db_svc ->>+ postgres: msgs
  postgres ->>- db_svc: ack
  db_svc ->>- chat_svc : ack
  note over kafka_br,chat_svc: kafka out_topic produce
  chat_svc ->>- kafka_br: msgs parsed
  end

  rect rgb(191,239,255)
  note over kafka_br,ws_svc: kafka out_topic consume
  kafka_br ->>+ ws_svc: msg
  note over clients,ws_svc: web socket (outgoing msg)
  ws_svc ->>+ clients: msg
  clients ->>- ws_svc: ack("Arrived")
  end

    note over clients,service_center : grpc request & response

这里从服务器出来的消息为什么还要再次经过kafka?这不是增加了复杂度了嘛~

blueeyezhy commented 1 month ago

我想着消息的进出,无论是单对单还是group chat都通过kafka解耦,功能上更模块化;kafka的broker更充分利用,整体上性能会更好吧

Xu-Mj commented 1 month ago

没有必要,增加不了吞吐,还增加了延迟,增加了复杂度,增加了出错的概率,功能上更模块化这块怎么说?

zoujiaqing commented 1 month ago

kafka 就是来保障消息能触达,稳定为先,性能优化次之,当然有更好的方案可以拿出来探讨。