我有用 .NET 编写的机器学习 WCF 服务。计算量不是很大,但是有一些小的计算。有 2 个大的共享集合:
- 包含统计信息和结果的 ConcurrentDictinary
lock
内的 MemoryChache,包含用户 session 详细信息。
它的工作速度非常快,并在 LAN 内提供几毫秒的响应时间(在客户端),工作负载不是很密集。由于工作负载会更高 - ConcurrentDictinary、lock`s、MemoryChache(带 GC)和 WCF 基础设施(带 WebServer)将成为限制因素。
现在我有一个拥有巨大流量的客户,所以我预计每天会有多达 10 亿个请求(每天最多 200m 用户 session * 来自一个用户的 5 个请求)请求。并且请求是同步的(页面加载时间将取决于它们)所以我必须尽量减少响应时间。
所以:
我能否使 WCF 基础结构水平扩展? WCF 请求能否以相等的比例并行化到多个端点?
为了通过 MemoryChache 和一般计算并行化内存使用,我认为可以使用某种自定义类型的 MapReduce。是否有任何内置的 .NET 分布式计算方法可以帮助我? AFAIK-不。 也许在 SCALA 中重写所有内容并使用 Hadoop 或更好的 Spark 会更容易。 但是不想重写所有的事情 :( 想法?
最佳答案
是的,查看用于水平缩放的负载平衡。您可以通过带有流量管理器 (F5 is popular provider - click this link for more info) 的硬件解决方案、通过软件平衡器 (e.g. Consul) 或通过您的代码 - there is a good sample on Code Project 来实现这一点。 .
负载平衡策略包括循环法,或基于资源的决定,决定哪个服务最不忙。
对于 1B 交易,网络可能成为瓶颈,这将迫使您采用硬件解决方案。对于路由智能很少的粗略解决方案,您可以在 100 或 1000 台机器上的不同端点上托管您的服务,然后让您的客户将流量分配给节点。
我认为最有说服力的信息是是否存在任何共享状态——实例是否需要相互了解。如果是这样,那么您需要考虑的不仅仅是简单的负载平衡!
关于c# - 是否可以使用 WCF 架构每天处理 1B 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37822281/