c# - 具有负载平衡的高负载服务器,使用 WCF 和 MSMQ

标签 c# wcf msmq

目前我正在开发一个空间数据处理服务器。 以下是要求:

  1. 服务器必须能够每秒接收和处理大约 150-200 条小消息(GPS 定位、一些额外数据)。
  2. 它必须是可扩展的。例如在多台机器上运行并平衡负载本身(没有 nlb)

目前我测试过这种架构:

  1. Incoming messages service,只负责接收消息(不绑定(bind)msmqwcf)
  2. 消息解析器服务。从 msmq 获取消息,解析它们并写入数据库,还向下一个服务发送通知(同样使用普通的 MSMQ 互操作)。这个可以在多台 PC 上工作
  3. 数据发布服务。包含小型缓存并负责从数据库中获取请求的数据。通过 wcf 使用 TCP 绑定(bind)向客户端发送通知。

此外,所有服务都有配置方法和一些通过 WCF TCP 绑定(bind)调用的其他任务。

小型性能测试表明它工作得相当快,但我想知道这是将这些 MSMQ 和 WCF 一起用于此特定应用程序的最佳方式。或者有人可以告诉我去哪里看?

最佳答案

我不是很确定你的具体问题,似乎更像是一个一般的设计问题,但因为我喜欢 MSMQ,所以我会在这里插话。

MSMQ 确实有一些缺点,特别是在负载平衡事务性消息方面,但总的来说它非常棒。

但是,您的要求都没有提到使用 MSMQ 的任何具体原因:持久性、可恢复的消息传递、断开连接的客户端等。所以我假设您有其中一些要求,但没有明确指出它们。

要求 #1 应该很容易满足/击败,特别是如果这些消息是小消息并且没有对它们执行明显的逻辑(例如,只是 Vanilla 插入/更新)并且 MSMQ 可以很好地处理竞争消费者。

要求 #2 除非您将事务性消息传递与 MSMQ 结合使用,否则并非不可能对 MSMQ 进行负载平衡以启用扩展,但它有一些注意事项。您如何对 MSMQ 进行负载平衡?参见 How to Load-Balancing MSMQ: A Brief Discussion了解一些详细信息(如果您还没有)。

除了负载平衡 MSMQ 的潜在问题,没有一个是不可克服的,这种方法没有任何问题。

扩展 MSMQ
MSMQ 在垂直方向(同一台机器)和水平方向(多台机器)的扩展性都很好。但是,很难使 MSMQ 真正具有高可用性,这可能是一个问题,也可能不是一个问题。请参阅此答案中已有的链接,了解有关使其高度可用的想法。

垂直缩放
当垂直扩展 MSMQ 时,有许多队列读取器实例在一台机器上运行,从一个队列读取。 MSMQ 处理得很好。我们所有的队列数据都在本地机器上的临时存储中。

如果我们失去托管队列的机器会怎样?
客户端可以发送并且消息将堆积在客户端的传出队列中,但在服务器恢复之前我们无法接收它们。

队列中的消息会怎样?
如果不引入某种高度可用的支持磁盘子系统,它们很可能会消失。即便如此,让另一个队列“连接”到该数据文件仍然是一个挑战。理论上,你可以找回它们。实际上,从边缘系统重新发送消息可能更容易。

根据交易量,队列大部分时间可能是空的,因此需要权衡数据丢失的风险和使其高度可用的工作量/成本。

水平缩放
水平扩展 MSMQ 时,每个处理机器上都有一个队列实例。每台机器可能有 [n] 个读取器,用于该队列,该队列运行在从队列接收消息的机器上。我们所有的队列数据都临时存储在多台机器上。

您可以使用 MSMQ 负载平衡文档中描述的任何方法,但是,我的经验几乎总是与应用程序负载平衡有关,被描述为软件负载平衡:客户端有一个可用的 msmq 端点列表交付给。托管队列的每个服务器都会遇到与单个队列相同的可用性问题。

也可能想查看 Nine Tips to Enterprise-proof MSMQ一些额外的 MSMQ 相关信息。

关于c# - 具有负载平衡的高负载服务器,使用 WCF 和 MSMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1288214/

相关文章:

c# - 在 Global.asax 中验证 HTTP 请求和返回特定 HTTP 响应的正确方法是什么?

wcf - 在 WCF 应用程序中设置 MSMQ 以确保可靠的邮件传递

wcf - MSMQ 和 WCF 合约 - future 的增强功能

c# - 有没有办法在 Entity Framework 中强制对相关数据进行排序?

C#实现垂直自动隐藏工具栏的方法

c# - 找出哪些接口(interface)对于 COM 对象是可查询的?

c# - 如何在代码而不是配置中创建 WCF EndPointBehaviors?

c# - CORS 在 Web API 中启用,但访问被拒绝

Windows Azure 上的 WCF session

c# - 如何检查公共(public)MSMQ是否为空