当前位置: 首页 > 知识库问答 >
问题:

如何扩大gRPC发布/子聊天服务?

裴兴学
2023-03-14

我正在学习如何与gRPC建立聊天服务。我注意到,大多数示例都将订阅者的所有连接存储到一个列表数据结构中。当聊天室收到新消息时,服务器将循环浏览该列表并发送新消息。

将订阅者存储在源代码的可变订阅者中。

我的问题是,当订阅者数量增加并将所有订阅者存储在HashMap中似乎是个坏主意,因为这会消耗太多内存?我尝试将这些连接存储在Redis中,但由于连接不可序列化,这可能是不可能的。

我的想法是在Kubernetes中部署多个pod实例。每个聊天服务都变得独立。当订阅者分布在不同的服务器上时,我如何才能正确地获取它们?

共有1个答案

邓季
2023-03-14

以下是我思考的几个方面:

  • 任何聊天系统都有聊天室大小的限制。你想支持多少订户?如果你想支持数十(甚至数百)个订阅者,我相信它可以很好地与内存中的订阅者列表配合使用,因为它比将订阅者列表放入外部缓存要快得多
  • 当您需要向整个订阅者列表发送消息时,您可以使用IO优化的线程池并行执行,而不是在该列表上循环。
  • 在pod中部署聊天服务是个好主意,您需要能够横向扩展,但您还需要在服务前面有一个智能网关,将来自给定用户的请求路由到存储其信息的pod(如果订阅者列表存储在内存中)。否则,如果此信息存储在外部(缓存中),您的聊天服务可能完全无状态。
 类似资料:
  • 问题内容: 我正在尝试使用Redis Cookbook示例: 我在这里取得了成功,但从未得到“消息”。 我的客户端index.htm是这个 客户如何发布到特定的Redis“聊天”频道。 问题答案: 如果您在node.js程序中使用Redis发布/订阅功能,则应使用一个Redis客户端连接来监听某个频道,使用另一个Redis客户端连接来发送常规命令和/或将消息发布到您的频道。从node_redis文

  • 仿QQ聊天布局,tableView图文混排,可根据聊天内容不同自动调整文字信息大小和位置。 [Code4App.com]

  • 8.10. 示例: 聊天服务 我们用一个聊天服务器来终结本章节的内容,这个程序可以让一些用户通过服务器向其它所有用户广播文本消息。这个程序中有四种goroutine。main和broadcaster各自是一个goroutine实例,每一个客户端的连接都会有一个handleConn和clientWriter的goroutine。broadcaster是select用法的不错的样例,因为它需要处理三种

  • 问题内容: 我正在寻求实现某种聊天服务器。我希望它可以扩展。这似乎是一个很大的问题,所以我想我希望答案是方向指针,有点探索性。 最终用户客户端是Web或电话客户端。我认为某种Websocket实现,例如Socket.IO很好。 在服务器端,我希望使用Node.js。我希望该体系结构具有可伸缩性,以使用户数量不受限制(嗯,在一定范围内,预计不会有很大的成功机会,如果是这样,则由更聪明,经验丰富的人来

  • 主要内容:服务端程序,客户端程序本节将带领大家结合咱们前面所学的知识开发一个聊天的示例程序,它可以在几个用户之间相互广播文本消息。 服务端程序 服务端程序中包含 4 个 goroutine,分别是一个主 goroutine 和广播(broadcaster)goroutine,每一个连接里面又包含一个连接处理(handleConn)goroutine 和一个客户写入(clientwriter)goroutine。 广播器(broa

  • 当我在PHP中使用file\u get\u contents函数来更新我的电报机器人时,我知道如何获取第一个聊天ID或文本,但这个页面不仅仅适用于一个用户 它获取在我的机器人中键入的第一个用户聊天ID。当我对他的短信做出反应时,我会将我的消息发送给使用我的机器人的最新用户。。。我该怎么做?