我试图了解如何创建自己的IMessageHub。我不想依赖任何额外的基础设施,而且消息数量很少。所以我决定使用一个简单的套接字解决方案来复制消息。我查看了不同ScaleoutMessageBus实现的源代码,但这些似乎需要一个额外的严格增加的标识符(Redis实现使用' INCR')。有人可以确认是这种情况吗?随机标识符不会削减它吗?
标识符是下面的OnRecieved方法的第二个参数
public abstract class ScaleoutMessageBus : MessageBus
{
...
protected virtual void OnReceived(int streamIndex, ulong id, ScaleoutMessage message)
答案 0 :(得分:2)
你是正确的,标识符应该严格增加。
这是使用的,因此SignalR客户端可以拥有他们收到的最后一条消息的全局标识符。当SignalR客户端重新连接到另一台服务器时(这对于长轮询传输尤其常见),它们会将此标识符传递给新服务器,以便它可以将重新连接的客户端从其内存缓存中丢失的任何消息发送。
如果标识符减少,SignalR将继续运行,但每个服务器将立即刷新其接收消息的内存缓存。这可能会导致重新连接客户端错过消息。
要了解SignalR需要以这种方式运行的原因,请考虑来自scaleout提供商的消息,其标识符的顺序如下:
1, 2, 3, 1, 2, 3
然后假设客户端重新连接到另一个服务器,说它收到的最后一个标识符是“2”。服务器无法使用消息进行响应,而不会有发送重复项或丢失消息的风险。使用SignalR的设计方式,客户端不应该接收重复项,但会丢失消息“3,1,2”。