Signalr 基于ScaleoutMessageBus的信号器背板是否需要递增标识符?

Signalr 基于ScaleoutMessageBus的信号器背板是否需要递增标识符?,signalr,signalr-backplane,Signalr,Signalr Backplane,我正在尝试了解如何创建自己的IMessageHub。我不想依赖任何额外的基础设施,而且消息的数量很低。所以我决定使用一个简单的套接字解决方案来复制消息。我已经查看了不同ScaleoutMessageBus实现的源代码,但这些似乎需要一个额外的严格递增的标识符(例如,Redis实现使用“INCR”)。有人能证实这是真的吗?一个随机标识符不会剪切它吗 标识符是下面OnReceived方法的第二个参数 public abstract class ScaleoutMessageBus : Messag

我正在尝试了解如何创建自己的IMessageHub。我不想依赖任何额外的基础设施,而且消息的数量很低。所以我决定使用一个简单的套接字解决方案来复制消息。我已经查看了不同ScaleoutMessageBus实现的源代码,但这些似乎需要一个额外的严格递增的标识符(例如,Redis实现使用“INCR”)。有人能证实这是真的吗?一个随机标识符不会剪切它吗

标识符是下面OnReceived方法的第二个参数

 public abstract class ScaleoutMessageBus : MessageBus
     {
...
   protected virtual void OnReceived(int streamIndex, ulong id, ScaleoutMessage message)

标识符应该严格递增,这是正确的

这是为了使信号器客户端可以拥有他们接收到的最后一条消息的全局标识符。当signar客户端重新连接到另一台服务器时(这在长轮询传输中尤其常见),它们会将此标识符传递给新服务器,以便新服务器可以发送重新连接的客户端从其内存缓存中丢失的任何消息

如果标识符减少,信号器将继续工作,但每台服务器将立即刷新其内存缓存中接收的消息。这可能会导致重新连接的客户端丢失消息

查看Sigalr为什么需要这样操作,考虑来自标量提供者的消息,其标识符顺序如下:

1, 2, 3, 1, 2, 3
然后假设一个客户端重新连接到另一个服务器,并说它收到的最后一个标识符是“2”。服务器无法在不发送重复或丢失消息的情况下响应消息。按照SignalR的设计方式,客户端不应接收重复的消息,但会丢失消息“3、1、2”