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