0

我将有大约 10 台计算机定期与服务器通信。

数据包不会太密集。(游戏数据更新)服务器将写入 postgres 数据库

我主要关心的是客户端的并发访问。如何处理排队的客户请求?

  • WCF 是一条好路线吗?因此,例如,通过 WCF 在 LAN 上使用 GET/POST 请求等而不是打开 tcp/ip 流是否可行?

任何人都可以针对可能出现的问题提出任何其他关注领域吗?

4

1 回答 1

2

使用 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 服务则不需要)。

http://blogs.msdn.com/b/santhoshonline/archive/2010/07/01/howto-nettcpbinding-on-iis-and-things-to-remember.aspx

因此,对于特定场景,这是使用 WCF 执行此操作的“1”方式。

尝试一种方法...查看它的内存使用、延迟、弹性等,如果您的需求发生变化,请更改您使用的绑定/编码...这就是 WCF 的美丽和噩梦。

如果您的客户端必须使用 HTTP 和 POST/GET 请求,则使用 Http 风格的绑定。如果您需要有保证的消息传递,那么您需要一个可靠的会话。

如果您的服务需要无限扩展,那么您可能会开始考虑在云中托管您的服务,例如使用 Windows Azure。

http://blog.shutupandcode.net/?p=1085

http://msdn.microsoft.com/en-us/library/ms731092.aspx

http://kennyw.com/work/indigo/178

于 2012-07-28T11:46:55.040 回答