高负载服务器负载均衡,使用WCF和MSMQ

Ale*_*iev 3 c# wcf msmq

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

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

目前我已经测试过这种架构:

  1. 传入消息服务,仅负责获取消息(不带msmqwcf绑定)
  2. 消息解析器服务.从msmq获取消息,解析它们并写入db,同时向下一个服务发送通知(再次使用普通的MSMQ互操作).这个可以在几台PC上工作
  3. 数据发布者服务.包含小缓存并负责从db获取请求的数据.通过wcf使用TCP绑定向客户端发送通知.

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

小的性能测试表明它的工作速度非常快,但我想知道这是将这些MSMQ和WCF一起用于这个特定应用程序的最佳方式.或者也许有人可以给我一个指导方向?

Zac*_*ham 15

我不太确定你有什么特别的问题,看起来更像是一般设计问题,但是我喜欢MSMQ,我会在这里说话.

MSMQ确实有一些缺点,特别是关于负载平衡事务性消息,但整体上它非常棒.

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

要求#1应该易于满足/击败,特别是如果这些是小消息并且没有明显的逻辑被执行(例如只是香草插入/更新)并且MSMQ非常好地处理竞争的消费者.

要求#2除非您使用与MSMQ事务性消息,它不是不可能的负载平衡MSMQ,使缩放,但是它有一些注意事项.你如何负载平衡MSMQ?请参阅如何负载平衡MSMQ:如果您还没有它们,请参阅一些简要讨论.

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

缩放MSMQ
MSMQ可以在垂直(同一台机器)和中等水平(许多机器)上非常好地扩展.然而,很难使MSMQ真正高度可用,这可能是也可能不是一个问题.请参阅本答案中已有的链接,了解如何使其高度可用.

垂直
扩展当垂直扩展MSMQ时,在单个机器上运行的队列读取器有很多实例,从单个队列读取.MSMQ处理得非常好.我们所有的队列数据都在本地计算机的临时存储中.

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

队列中的消息会发生什么?
如果没有引入某种高可用性的支持磁盘子系统,它们很可能会消失.即便如此,将另一个队列"连接"到该数据文件也是一个挑战.理论上,你可以让他们回来.实际上,它可能更容易从边缘系统重新发送消息.

根据事务量,队列在大多数情况下可能是空的,因此需要权衡数据丢失的风险与使其高度可用的工作量/成本.

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

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

也可能想要查看有关企业证明MSMQ的九个提示,以获取一些额外的MSMQ相关信息.