分布式EventBus的Socket实现 - 发布订阅

在这篇文章中,EventBus实现 - 发布订阅 - XML加载 所适用的范围只是本机的事件传播,要是牵涉到多台服务器之间的事件传播就不行了,解决办法有用msmq解决的,也有用redis的发布订阅解决的,这次用C# socket来实现,能实现立刻推送事件到所以server上。

这次的子系统适用的场景如下:

主要分2个部分:各个server使用的Event Bus Broker以及Event Bus Server。

Broker与Server之间的通信协议就3个:ME、Subscribe、Publish。分别代表:我的名字是、我要订阅的事件是、我触发事件。

Event Bus Server是基于SuperSocket开源组件写的,非常方便。实现了3个对应的命令类(建议大家先看看SuperSocket的文档),如下:

public class ME : CommandBase<EventDispatcherBusSession, StringRequestInfo>
{
public override void ExecuteCommand(EventDispatcherBusSession session, StringRequestInfo requestInfo)
{
session.AssociatedServerIdentity = EventBase.Helper.RestoreSpecialCharacters(requestInfo.Parameters[0]);
Console.WriteLine(string.Format("[{0}]: connected.", session.AssociatedServerIdentity));
}
} public class Publish : CommandBase<EventDispatcherBusSession, StringRequestInfo>
{
public override void ExecuteCommand(EventDispatcherBusSession session, StringRequestInfo requestInfo)
{
string evtClassPath = EventBase.Helper.RestoreSpecialCharacters(requestInfo.Parameters[0]);
string evtXml = EventBase.Helper.RestoreSpecialCharacters(requestInfo.Parameters[1]); foreach(EventDispatcherBusSession s in session.AppServer.GetAllSessions())
{
if (s.AssociatedServerIdentity == session.AssociatedServerIdentity)
continue; if (s.SubscribedEventClasses.Contains(evtClassPath))
{
s.Send("Publish " + requestInfo.Body);//forward only
Console.WriteLine(string.Format("Forwarding publish command from {1} to server: [{0}]", s.AssociatedServerIdentity, session.AssociatedServerIdentity));
}
}
}
} public class Subscribe : CommandBase<EventDispatcherBusSession, StringRequestInfo>
{
public override void ExecuteCommand(EventDispatcherBusSession session, StringRequestInfo requestInfo)
{
string classPath = EventBase.Helper.RestoreSpecialCharacters(requestInfo.Parameters[0]);
if (session.SubscribedEventClasses.Contains(classPath))
return; session.SubscribedEventClasses.Add(classPath); string msg = "";
msg+=string.Format("[{0}], now subscribed these events:\r\n", session.AssociatedServerIdentity);
foreach(string evtClass in session.SubscribedEventClasses)
msg += string.Format(" {0}\r\n", evtClass);
Console.WriteLine(msg);
}
}

启动server代码:

static void Main(string[] args)
{
var appServer = new EventDispatcherBusServer(); if (!appServer.Setup(2012))
{
Console.WriteLine("Failed to setup!");
Console.ReadKey();
return;
} Console.WriteLine(); if (!appServer.Start())
{
Console.WriteLine("Failed to start!");
Console.ReadKey();
return;
} Console.WriteLine("The server started successfully, press key 'q' to stop it!"); Console.ReadKey(); appServer.Stop();
}

server端没多少好说的,都是很简单的,下面来看看客户端:

static void Main(string[] args)
{
EventBusClientBroker busBroker = new EventBusClientBroker("127.0.0.1", 2012, "App server 2", "AppEvents.dll");
busBroker.NewEventReceived += new EventReceived(busBroker_NewEventReceived);//新event被推送过来的事件
busBroker.Connect(); busBroker.Subscribe<NewUserRegisteredEvent>();//订阅Event //busBroker.Close();
} static void busBroker_NewEventReceived(string evtClass, object evt)
{
//这里会将event对象发过来
//evtClass是evt的class全路径
if (evt is NewUserRegisteredEvent)
Console.WriteLine(((NewUserRegisteredEvent)evt).UserName);
else if (evt is UserProfileUpdatedEvent)
Console.WriteLine(((UserProfileUpdatedEvent)evt).UserID);
}

如果要触发一个事件,则:

                   NewUserRegisteredEvent evt = new NewUserRegisteredEvent();
evt.RegisterDate = DateTime.Now;
evt.UserName = "aaron";
busBroker.Publish<NewUserRegisteredEvent>(evt);

我们来看看效果图:

搞定,代码下载

自省推动进步,视野决定未来。
心怀远大理想。
为了家庭幸福而努力。
用A2D科技,服务社会。
 

分布式EventBus的Socket实现 - 发布订阅的更多相关文章

  1. EventBus实现 - 发布订阅 - XML加载

    EventBus实现 - 发布订阅 - XML加载 受到CQRS的影响,写了个EventBus,能实现发布订阅模式执行event,在DDD模型中,可以使用如下代码触发事件: EventBus bus ...

  2. RabbitMQ 发布订阅

    互联网公司对消息队列是深度使用者,因此需要我们了解消息队列的方方面面,良好的设计及深入的理解,更有利于我们对消息队列的规划. 当前我们使用消息队列中发现一些问题: 1.实际上是异步无返回远程调用,由发 ...

  3. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

    一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...

  4. 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载

    一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用 ...

  5. 分布式发布订阅消息系统 Kafka 架构设计[转]

    分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...

  6. 基于.NET Socket Tcp的发布-订阅框架

    基于.NET Socket Tcp的发布-订阅框架 一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已 ...

  7. Kafka(分布式发布-订阅消息系统)工作流程说明

    Kafka系统架构Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和 ...

  8. kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统

    一.kafka 简介 今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 ...

  9. Kafka — 高吞吐量的分布式发布订阅消息系统【转】

    1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有哪两个条件 ...

随机推荐

  1. 【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍

    原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------ ...

  2. Python的html和xml解析库Beautiful Soup

    网站:http://www.crummy.com/software/BeautifulSoup/ 版权声明:本文博主原创文章,博客,未经同意不得转载.

  3. XML的序列化与反序列化

    开发时会把数据持久化成xml格式,当然可以用xmlwriter来实现,不过感觉不方便,而且很繁琐.推荐使用直接序列化.反序列化对象的方法来处理. 直接上代码: public static class ...

  4. sql分页查询公式

    分页查询公式: select top PageRow(每页显示的数据行数) from 表名 where 主键  not in(select top PageRow*(当前页数-1) 主键  from ...

  5. How to: Installshield做安装包时如何添加文件

    原文:How to: Installshield做安装包时如何添加文件 我一直以为这不是一个问题,可是没想到在几个群内,对于如何向安装包添加文件不解的大有人在,今日稍暇,整理成篇,以供参考 首先我想再 ...

  6. Angular指令(一)

    Angular开发者手册重点翻译之指令(一) 创建自定义的指令 这个文章将解释什么需要在自己的angularjs应用中创建自己的指令,以及如何实现它. 什么是指令 在高的层面上讲,指令是DOM元素中的 ...

  7. 王立平--string.Empty

    String.Empty 字段 .NET Framework 类库 表示空字符串.此字段为仅仅读.命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) protecte ...

  8. 自己编译的openwrt在开机时一直打印jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found...的错误提示

    具体的输入信息是这样的. uboot> http Link down: eth0 Ethernet mode (duplex/speed): / Mbps HTTP server is star ...

  9. SQL Server中生成测试数据

    原文:SQL Server中生成测试数据 简介      在实际的开发过程中.很多情况下我们都需要在数据库中插入大量测试数据来对程序的功能进行测试.而生成的测试数据往往需要符合特定规则.虽然可以自己写 ...

  10. js获取编辑框游标的位置

    代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...