【问题标题】:Basic SignalR IMessageBus implementation基本 SignalR IMessageBus 实现
【发布时间】:2014-02-21 02:58:12
【问题描述】:

我有一个服务应用程序,其工作方式与 SignalR 背板非常相似,因此我认为创建自己的 IMessageBus 实现来与后端通信是个好主意,而不是推出我自己的东西。问题是我找不到关于这份合同的太多信息。虽然我一直在看代码(看起来很不错),但我很难理解一些概念。

public interface IMessageBus
{
    Task Publish(Message message);
    IDisposable Subscribe(ISubscriber subscriber, string cursor, Func<MessageResult, object, Task<bool>> callback, int maxMessages, object state);
}
  1. Task Publish(Message message);

这个很简单,基本上它必须向后端发送消息。我不担心这个,因为我的应用程序从服务器到客户端是单向的。

  1. IDisposable Subscribe(ISubscriber subscriber, string cursor, Func&lt;MessageResult, object, Task&lt;bool&gt;&gt; callback, int maxMessages, object state);

    • return:尽管说IDisposable,但我看到它总是返回一个订阅对象,但是为什么IDisposable
    • subscriber 标识一个连接。该连接可以订阅或取消订阅群组。
    • cursor: 是最后收到的消息 ID。
    • callback:这个回调什么时候执行?
    • state:这到底是什么?

有人可以解释一下这个方法是如何工作的吗?

【问题讨论】:

    标签: signalr signalr-backplane


    【解决方案1】:

    我建议从 ScaleoutMessageBus (https://msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.messaging.scaleoutmessagebus(v=vs.111).aspx) 继承

    它提供了一个抽象并封装了所有订阅管理,因此可以专注于背板实现。

    您还可以查看 Redis 基本实现 (https://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Redis/RedisMessageBus.cs) ,作为示例。

    如果有趣的话 SignalR 是开源的,那么你也可以看看 ScaleoutMessageBus 的实现 (https://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Core/Messaging/ScaleoutMessageBus.cs)

    希望对您有所帮助。

    【讨论】: