我将有大约10台计算机定期与服务器通信。
数据包不会过于数据密集。 (游戏数据更新) 服务器将写入postgres数据库
我主要关心的是客户端的并发访问。如何处理客户端请求的排队?
有人可以建议任何其他可能出现问题的重点领域吗?
答案 0 :(得分:2)
使用WCF,您可以灵活选择要使用的内容取决于您想要做什么。知道选择什么来自实验和经验。
您可以使用Fiddler,Wireshark和ServiceTraceViewer等工具来分析客户端与服务器之间的对话 - 应定期使用它们来检测低效的对话。
你正在制作一款需要通过中央服务器传递数据的游戏......因此,大概你希望它尽可能高效且延迟最低。
因此,理想情况下,任何进入服务器的请求都要尽快处理...您希望最大限度地减少任何开销。
您是否需要保证服务器收到该消息,因此您可以保证收到回复(即可靠的递送)?
是否需要按照发送邮件的相同顺序处理邮件?
然后考虑您的服务器需要扩展吗?你一次只能拥有少量的客户吗?你提到10?.....这会增加到一百万吗?
然后考虑你的环境....你提到一个局域网...客户端总是在同一个局域网上......即。内联网?如果是这样,那么他们可以使用TCP套接字直接与服务器通信....而无需通过IIS堆栈。
通过WCF上面的某些假设,您可以选择使用带有二进制编码的netTCPBinding
的端点,并使用以下服务:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)].
这会在客户端和服务器之间建立会话(只要你使用支持会话的绑定)(不扩展,因为每个客户端都有自己的服务器实例来管理他们的会话),它将允许多个客户端并行处理,二进制编码“可能”减少数据大小(您可以选择避免这种情况,因为您说您的数据不是密集的,而二进制实际上可能会为小邮件大小增加更多开销)。
如果另一方面,您的服务需要能够无限扩展并保持较低的响应时间,不介意消息是丢失,还是以不同的顺序交付,或者必须通过HTTP等交付,等等,然后......然后还有其他可以使用的Bindings,InstanceContextModes,消息编码等。如果您真的想要变得复杂,您可以让您的服务公开以不同方式配置的多个端点,并且您的客户可能更喜欢特定的配方。
注意:(如果您使用IIS托管WCF服务并且使用netTCPBinding
,则必须启用net.tcp协议....如果您自托管WCF服务则不需要。
因此,对于特定场景,这是使用WCF执行此操作的“1”方式。
尝试一种方式...查看其内存使用,延迟,弹性等,如果您的需求发生变化,请更改您使用的绑定/编码......这就是WCF的美丽和噩梦。
如果您的客户端必须使用HTTP和POST / GET请求,请使用Http风格的绑定。如果您需要有保证的消息传递,那么您需要一个可靠的会话。
如果您的服务需要无限扩展,那么您可能会开始考虑在云中托管您的服务,例如使用Windows Azure。
http://blog.shutupandcode.net/?p=1085