处理C#服务器的最佳方法是什么?

时间:2012-07-28 06:07:28

标签: c# multithreading web-services networking

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

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

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

  • WCF是一条好路线吗?因此,例如,打开tcp / ip流,而不是使用GET / POST请求&通过局域网上的WCF?

有人可以建议任何其他可能出现问题的重点领域吗?

1 个答案:

答案 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服务则不需要。

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