出于测试目的,我想创建一个套接字服务器,它将包含分布在AWS上的X个ec2实例上的1000多万个并发套接字连接(仍然使用JXCore,Java或Erlang决定node.js)。这些套接字将每隔10秒随机地向另一个套接字发送消息。我无法理解如何有效地存储和读取这些套接字。
我可以看到的两个选项是将套接字对象存储在应用程序本身的地图中,或者将套接字存储在快速数据库(如Redis)中。将套接字存储在应用程序内部的数据结构中的问题是它能够扩展,是否可靠,以及当数百万个套接字需要找到彼此时,读取性能如何。如果我将它们存储在像redis这样的数据库中,每次都必须有一个网络调用,因为Socket A需要知道Socket B所在的位置才能发送消息。我担心这会大大降低性能。
我想知道可扩展套接字服务器的最佳做法是什么,因为我在互联网上找不到回答这个问题的任何内容。我发现在线的每个套接字服务器简单地广播到每个其他套接字,而不是具有特定的套接字,只包含10个套接字。
答案 0 :(得分:0)
如果您希望此应用程序分布在多个节点上,则需要至少确定目标节点的方法。如果它可能是源和当前数据包的纯函数,则不需要中央存储,这是最好的解决方案。
在其他情况下,中央存储是不可避免的,但可能会应用一些优化来减少对它的访问。本地套接字可以很容易地存储在本地地图中(在erlang中的ets或mnesia,在其他语言中使用共享单例映射)并首先进行检查。可以告诉源缓存目标地址,以便数据包包含所有必要的信息。或者,目标缓存可以存储在源套接字节点上,以不依赖于客户端行为。此缓存可用于路由,并且仅当路由操作不成功时才可访问中央存储。
可能是其他一些优化,取决于您的案例中可用的内容。