SignalR的通讯方式决定了其高性能,但是即便如此,当消息的并发量上来以后,单节点的Hub服务器依然可能无法承载总的消息吞吐量,那么如何对Hub服务器做水平扩展呢?

从微软官方的文档上看,SignalR是具有消息底板功能的,SignalR核心组件公开了一个IMessageBus的接口,只需要实现该接口,就能实现消息订阅功能。官网提供了3种解决方案:Azure、Redis、SqlServer,nuget平台上有更多的基于消息队列的第三方底板。本篇以Redis为例子展示一下以消息底板模式运作的Hub服务器。

服务端

public class Startup
{
public void Configuration(IAppBuilder app)
{ GlobalHost.DependencyResolver.UseRedis("192.168.1.66", , string.Empty, "SignalRBus");
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll); var hubConfiguration = new HubConfiguration
{
EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
}
}

在启动类中,通过DependencyResolver的扩展方法来注册基于Redis的MessageBus,其中前2个参数是地址和端口,第三个参数为Redis服务器的密码,消息订阅的名称。

public class ChatHub : Hub
{
public void Chat(string msg)
{
Clients.All.Display("Receive Msg:" + msg);
}
}

建立一个简单的Hub,只提供一个Chat的方法,内部实现广播。

static void Main(string[] args)
{
using (WebApp.Start<Startup>("http://*:8001/"))
{
Console.WriteLine("Server running at http://localhost:8001/");
Console.ReadLine();
}
}
static void Main(string[] args)
{
using (WebApp.Start<Startup>("http://*:8002/"))
{
Console.WriteLine("Server running at http://localhost:8002/");
Console.ReadLine();
}
}

建立2个启动项,端口号分别为8001和8002,用以启动2个hub的实例。

客户端

static void Main(string[] args)
{
var hubConn = new HubConnection("http://localhost:8001");
var proxy = hubConn.CreateHubProxy("ChatHub");
hubConn.Start().Wait();
while (true)
{
var guid = Guid.NewGuid().ToString();
Console.WriteLine("Send Msg:" + guid);
proxy.Invoke("Chat", guid).Wait();
Thread.Sleep();
} }

客户端1连接上8001,利用一个循环不断的往服务端发guid。

static void Main(string[] args)
{
var hubConn = new HubConnection("http://localhost:8002");
var proxy = hubConn.CreateHubProxy("ChatHub");
proxy.On<string>("Display", (msg) => { Console.WriteLine(msg); });
hubConn.Start().Wait();
Console.ReadLine();
}

客户端2连接上8002,注册一个Display的方法,用于接收服务端推送的消息。

运行情况

图中可知,client1的send msg,被client2接受到了。

SignalR 循序渐进(五)多个Hub服务器下的消息订阅的更多相关文章

  1. SignalR 循序渐进(四) Hub的生命周期以及IoC

    有阵子没更新这个系列了,最近太忙了.本篇带来的是Hub的生命周期以及IoC. 首先,Hub的生命周期,我们用一个Demo来看看: public class TestHub : Hub { public ...

  2. SignalR 循序渐进

    SignalR 循序渐进(五)多个Hub服务器下的消息订阅 hellsoul86 2014-08-18 11:29 阅读:840 评论:7     SignalR 循序渐进(四) Hub的生命周期以及 ...

  3. 20145216 20145330 《信息安全系统设计基础》 实验五 简单嵌入式WEB 服务器实验

    20145216 20145330 <信息安全系统设计基础> 实验五 简单嵌入式WEB 服务器实验 实验报告封面 实验步骤 1.阅读理解源码 进入/arm2410cl/exp/basic/ ...

  4. 20145210 20145226 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验

    20145210 20145226 <信息安全系统设计基础>实验五 简单嵌入式WEB服务器实验 结对伙伴:20145226 夏艺华 实验报告封面 实验目的与要求 · 掌握在ARM开发板实现 ...

  5. 20145303 20145339 《信息安全系统设计基础》 实验五 简单嵌入式WEB服务器实验

    20145303 20145339 <信息安全系统设计基础> 实验五 简单嵌入式WEB服务器实验 实验目的与要求 1.掌握在ARM开发板实现一个简单WEB服务器的过程 2.学习在ARM开发 ...

  6. IIS服务器下301跳转是怎么样实现的?

    301跳转的用法很多,对于一名SEO来说,301转向是必须掌握的本领,但是对于301转向而言,许多人都并不清楚,301跳转以后,需不需要对原网站进行优化,再次提及一边301跳转的定义. 所谓301跳转 ...

  7. Linux服务器下对Oracle作Rman备份

    由于工作需要,最近要对几台Linux系统下的Oracle数据库进行Rman备份,就在操作的同时,整理了一下,方便今后作为资料进行查阅. ------------------------Linux服务器 ...

  8. 虚拟机centos7服务器下,启动oracle11g数据库和关闭数据库

    转载:https://blog.csdn.net/ShelleyWhile/article/details/74898033 一.前提条件:虚拟机centos7服务器下,已经安装好oracle11g数 ...

  9. windows环境下apache-apollo服务器搭建及发布订阅测试

    查证了一些资料之后,发现 apache-apollo服务器使用的人还是挺多的,资料也比较齐全,所以直接选择 apache-apollo了,具体性能如何,先用起来再说吧: 1.下载 apache-apo ...

随机推荐

  1. atitit.Windows Server 2003 2008 2012系统的新特性 attilax 总结

    atitit.Windows Server 2003  2008  2012系统的新特性 attilax 总结 1. Windows Server 2008 新特性也可以归纳为4个方面. 1 2. 相 ...

  2. 【Android】14.2 外部文件存储和读取

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 1.基本概念 内部存储的私有可用存储空间一般都不会很大,对于容量比较大的文件,例如视频等,应该将其存储在外部存储设 ...

  3. android.animation(4) - ObjectAnimator的ofInt(), ofFloat()(转)

    一.概述 1.引入 上几篇给大家讲了ValueAnimator,但ValueAnimator有个缺点,就是只能对数值对动画计算.我们要想对哪个控件操作,需要监听动画过程,在监听中对控件操作.这样使用起 ...

  4. javascript的单线程

    1.什么是javascript的单线程javascript是单线程的语言,所以在一个进程上,只能运行一个县城,不能多个线程同时运行.也就是说javascript不允许多个线程共享内存空间.如果多个线程 ...

  5. 从零开始,跟我一起做jblog项目(二)Maven

    从零开始,跟我一起做jblog项目(一)引言 从零开始,跟我一起做jblog项目(二)Maven maven是一个项目管理工具,尤其适用于JAVA世界 在jblog的开发前期,还没有系统使用过mave ...

  6. 【pywin32总结】

    #下面是必备的#注意!所有方法后面都要加括号()!!! import win32com from win32com.client import Dispatch,constants w = win32 ...

  7. C#连接手机安装软件和发送信息

    今天突然想到怎么用winform程序连接自己的安卓手机,然后做发送短信的操作,查了很多资料 发现用ADB.exe 这个安卓自带的调试库 可以实现挺多功能的 前提是你自己手机已经和你电脑连接成功过,就是 ...

  8. cs108 03 ( 调试, java通用性)

    Debuger Great questions These questions will solve most bugs: what method shows the symptom ? what l ...

  9. sql 追踪 神器

    http://www.thinkphp.cn/download/690.html 一个中国人开发的php工具箱此工具能几秒钟追踪出sql 数据库操作, 能分析出 Thinkphp3.2 的任意sql ...

  10. 时钟.html

    <!DOCTYPE html><html charset="utf-8"> <head> <title>时钟</title&g ...