【问题标题】:Group communication system for .NET.NET 组通信系统
【发布时间】:2011-11-21 01:37:03
【问题描述】:

我需要一种传输机制,以保证消息的全序广播。

例如,我有三台机器 A、B 和 C,它们发送消息:A -> a0, a1, a2.. aN; B -> b0, b1.. bM; C -> c0, c1.. cK。如果其中一台机器以某种顺序接收消息(a0, a1, b0, c0, b1, a2...),那么所有其他机器将以相同的顺序接收所有消息!

我需要在 .NET 环境中使用这个东西。 NServiceBus 或 Mass Trnansit 可以为我完成这项工作吗?

【问题讨论】:

  • 你的意思是如果A、B和C发送消息。其他机器会以相同的顺序接收组合的交错消息流吗?
  • 不行,包括A、B、C在内的所有机器都必须以相同的顺序接收所有消息。每条消息都必须传递给每个参与者,包括发件人。这个问题被称为原子广播并且已经解决了 - en.wikipedia.org/wiki/Atomic_broadcast。我正在寻找可用于生产的 .NET 实现。

标签: .net distributed reliability


【解决方案1】:

我认为它需要某种具有有序保证的分布式队列,也许Apache Zookeeper 的DistributedQueue 配方可以满足它

【讨论】:

    【解决方案2】:

    在发送解决您的问题之前,不会简单地将消息批处理到集合中。这样当接收到的时候,所有的receiver都会一直以相同的顺序遍历结果集。

    【讨论】:

    • 这仅适用于所有消息都从一个来源发送的情况。但在这种情况下,所有消息都将以可预测的顺序接收(如果使用像 tcp 这样的传输)。在我的例子中,所有消息同时从不同的来源广播并被每个参与者接收,并且每个参与者必须以相同的顺序接收消息。
    • 在不对所有消息进行批处理的情况下实现此目的的唯一方法是为每条消息提供某种 ID 或序列号。并让接收应用程序等待所有可能的结果,然后在它通过序列号/ID 获得所有内容后对其进行排序。您想要做的事情可以通过重新测序来解决。 eaipatterns.com/Resequencer.html
    • 如果你真的看 JGroup,它不会做你试图不做的同样的事情。即首先获取所有消息,然后从单个服务以同步方式将它们全部发送,这意味着每个接收者无论如何都将始终获得 FIFO 效果。
    【解决方案3】:

    像 TIBCO EMS 这样的产品难道不能解决这些可靠的实时广播和交付问题吗?这些 API 包含包括 .NET 在内的大多数语言的包装器。

    【讨论】:

    • 我认为我不需要企业消息服务,我需要像JGroup这样的群组通信系统,它是一个完全不同的野兽。
    • 此时我使用集中式方法实现了我需要的功能。有一个服务器 - 定序器,它接收系统中的所有消息,然后以相同的顺序将所有消息传递给每个参与者。但这种方法不可扩展,也不安全。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2021-01-13
    • 2011-02-18
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多