我想将消息流(Go中的频道)发送到通过websocket连接到我的每个客户端。每隔约100毫秒发送一条新消息。如何保持打开和关闭连接的打开连接列表,同时必须对该列表进行某种迭代以发送> 50,000连接的消息?现在我将连接存储在与单个互斥锁同步的地图中,但我不确定它是否可以扩展。
答案 0 :(得分:1)
最好的方法是不要维护一个列表。
每个连接应连接到具有给定标识符的集线器(例如:用户ID,连接ID等),订阅此类标识符的消息并使用该标识符发布消息。如果需要,还可以订阅全局消息和组消息。
更新:
要扩展到50K +连接,您将需要更加分散的方法,而不是带有互斥锁的简单映射。例如:https://github.com/bitly/nsq(在GO中制作)“NSQ是一个实时分布式消息传递平台,旨在大规模运行,每天处理数十亿条消息。”
答案 1 :(得分:1)
这个问题可以更一般地说明:你有一组价值观。您需要迭代集合,添加到集合并从集合中删除高并发性。
我会从你的建议开始:使用受互斥锁保护的地图。
如果您发现互斥锁存在高争用,请考虑锁定条带化。这是您使用N个静音和映射对的位置,其中通过键的散列选择对。