【发布时间】:2011-02-14 18:35:32
【问题描述】:
我已经看到了在控制台应用程序、Windows 服务等中自托管 WCF 服务的示例、示例代码等。
我的问题是,这将如何在生产中发挥作用?会有效率吗?它会扩展吗?
我不确定它是如何工作的,所以另一个问题是,它会是单线程的吗?多线程?我需要管理多线程吗?应用程序域?
出于与应用程序相关的原因,我更喜欢使用命令行、Windows 服务托管。
【问题讨论】:
我已经看到了在控制台应用程序、Windows 服务等中自托管 WCF 服务的示例、示例代码等。
我的问题是,这将如何在生产中发挥作用?会有效率吗?它会扩展吗?
我不确定它是如何工作的,所以另一个问题是,它会是单线程的吗?多线程?我需要管理多线程吗?应用程序域?
出于与应用程序相关的原因,我更喜欢使用命令行、Windows 服务托管。
【问题讨论】:
我的问题是,
会有效率吗?它会扩展吗?
是的,是的。但是对于真正大规模的应用程序,您仍然应该考虑 IIS (+WAS)。
所以另一个问题是,那会是单线程的吗?多线程?
这由配置决定。
【讨论】:
会有效率吗?
这取决于服务实现,取决于它能够在特定时间范围内管理的最大请求数。效率是一个相对的衡量标准:假设您的服务能够处理 20 条消息/秒,如果您的要求是能够处理 10 条消息/秒,那么您的服务是高效的。但是如果要求是30,那就不是。
它会扩展吗?
再一次,它与托管无关。你的服务是无状态的吗?如果不是这样,它们可能不会扩展太多,因为负载平衡是不可能的。
它可以管理吗?
可能不会: - 您需要让用户登录服务器才能运行应用程序 - 它不会随服务器自动启动 - 它不能在失败时自动重启 - 它不会主动创建服务实例 - 它不提供(没有自定义代码)检查服务运行状况的方法
单实例?多线程?
如果您的服务在每个客户端的调用之间不保持状态,则将其配置为“每次调用一个实例且无多线程” -> 无并发,高吞吐量
如果您的服务确实保持状态,则将其配置为“每个会话一个实例和多线程”以允许客户端执行并发调用。小心并发问题并保护您的资源。
如果您的服务不维护每个客户端的状态,而是为所有调用保存一些全局数据,请考虑“每个服务的单个实例和多线程”。请记住可能的并发问题。在这种情况下,您不妨使用“每次调用一个实例”并将全局存储保留在服务之外。
【讨论】:
托管 WCF 端点的 Windows 服务适用于不会经常受到攻击的小型服务;你不必弄乱 IIS(这可能是一个真正的痛苦 IMO)。但是,只有一个侦听器正在侦听,因此不建议将它用于可能同时从多个位置命中的服务(为此使用 IIS;它设置了一个可以处理许多同时请求的应用程序池)。该模型适用于两台机器之间的一对一互操作;您可以将服务主机设置在某个仓库中的“设置并忘记”盒子上,并调用它来执行简单但自定义的任务,例如重新启动、日志转储等。
避免让任何用户应用(控制台或其他)托管服务端点,初始概念验证测试除外。除了单侦听器的缺点之外,用户应用程序必须在登录用户的上下文中运行(而不是服务用户,它们作为 Windows 启动的一部分“登录”),并且必须具有自定义的“keepalive”监测;通过一项服务,可以告诉 Windows 在它崩溃时简单地重新启动它,而它不会对用户应用程序崩溃而折腾,只是为了防止该程序关闭整个操作系统(并询问用户是否想要报告崩溃)。
【讨论】: