考虑一个主持许多桌面的扑克游戏服务器。当玩家在大厅时,他有一个所有活动表及其统计数据的列表。当玩家加入,玩耍和离开牌桌时,这些统计数据会不断变化。可以添加和关闭表。 不知何故,必须将这些更改通知给客户。
您将如何实现此功能? 你会在大厅使用TCP / UDP(也就是说,如果用户连接到服务器观察大厅,或者你会采用请求 - 响应机制)? 服务器是否会通知客户端每个事件,或者客户端是否应该轮询服务器?
请记住:也许这种系统最重要的目标是可扩展性。应该很容易添加更多服务器以应对不断增长的优势,而所有用户都应该看到一个由多个服务器组成的大型列表。
答案 0 :(得分:1)
此特定问题表明了应用程序设计中的一个非常基本的问题 - 客户端应该如何连接到服务器。
当可扩展性成为问题时,请始终使用可扩展的解决方案,使用非阻塞I / O模式,例如Reactor design pattern。非常优选的是使用已经具有这种模式的工作和测试实现的标准解决方案。
特别是在你的情况下,它涉及一个不断更新的快速游戏,使用可扩展服务器(同样,非阻塞I / O)听起来是合理的,它通过TCP保持与每个客户端的连接,并且向他提供他需要知道的信息。
请求 - 响应周期听起来不太适合您的情况,但应根据您的应用的确切规范进行验证。
答案 1 :(得分:0)
这是我的基本建议:
服务器通过一个接口更新列表(添加,删除和更改现有项),该接口保留已在列表上应用的固定操作长度的队列。每个操作都有一个时间戳。当队列已满时,将逐步丢弃最旧的操作。
当用户首先需要检索列表时,它会要求服务器向他发送完整列表。服务器使用当前时间戳发送列表。
每个仲裁时间段(10-30秒?)后,客户端要求服务器向他发送自收到时间戳以来已应用于列表的所有操作。 然后,服务器检查时间戳是否仍然出现在列表中(即,它大于第一个项目的时间戳),如果是,则向客户端发送从该时间到现在的操作列表,再加上当前时间戳。如果它太旧,服务器会再次发送完整列表。
UDP似乎适合这种方法,因为如果偶尔“更新周期”丢失,这并不是什么大问题。