使用NBear.MQ分布式服务消息队列模块开发分布式系统

NBear.MQ是NBearFramework中新增的分布式消息队列模块,作为NBear Framework的新成员,NBear.MQ秉承NBear一贯的易于使用和零配置需要的特点,大大改善开发基于消息队列的分布式系统的效率。本文通过介绍一个基于NBear.MQ的Sample - TestServiceMQ,演示基于NBear.MQ开发分布式系统的基本方法。

解析

1、TestRemotingServer

首先是我们的Server,对于Server,如果您使用NBear.MQ内置的MemoryServiceMQ,则几乎不需要编码,只需要运行并发布server实例为remoting service。

1  class Program
2  {
3    static void Main(string[] args)
4    {
5      MemoryServiceMQ mq = new MemoryServiceMQ();
6      mq.OnLog = new LogHandler(Console.WriteLine);
7      RemotingServiceHelper rh =
8        new RemotingServiceHelper(RemotingChannelType.TCP, "127.0.0.1", 8000, new LogHandler(Console.WriteLine));
9      rh.PublishServiceInstance("MMQ", typeof(IServiceMQ), mq, System.Runtime.Remoting.WellKnownObjectMode.Singleton);
10
11      while (Console.ReadLine() != "q")
12      {
13      }
14    }
15  }

注意,关键是第8-9行这里,我们调用RemotingServiceHelper类发布MemoryServiceMQ的实例mq到tcp://127.0.0.1:8000/MMQ。

如果你不希望使用MemoryServiceMQ,而希望使用基于其它MQ如MSMQ或ActiveMQ系统的MQ控制,您可以自己实现IServiceMQ接口,用来代替这里的mq。

2、TestServiceHost

Service host顾名思义就是服务的提供者,本示例的TestServiceHost定义了两个service,MathService和HelloWorldService,如下:

1  public class MathService : BaseAutoService
2  {
3    public MathService(IServiceMQ mq)
4      : base("demo.math", mq)
5    {
6    }
7
8    private int getResult(char op, int x, int y)
9    {
10      int rt = 0;
11      switch (op)
12      {
13        case '+':
14          rt = x + y;
15          break;
16        case '-':
17          rt = x - y;
18          break;
19        case '*':
20          rt = x * y;
21          break;
22        case '/':
23          rt = x / y;
24          break;
25
26      }
27      return rt;
28    }
29
30    protected override ResponseMessage Run(RequestMessage msg)
31    {
32      Parameter[] parms = msg.Parameters;
33      int rt = getResult(parms[0].Value.ToString()[0], int.Parse(parms[1].Value.ToString()), int.Parse(parms[2].Value.ToString()));
34      ResponseMessage retMsg = new ResponseMessage();
35      retMsg.ServiceName = msg.ServiceName;
36      retMsg.Parameters = new Parameter[] { new Parameter("Result", rt) };
37      retMsg.MessageId = Guid.NewGuid();
38      retMsg.TransactionId = msg.TransactionId;
39      retMsg.RequestHeader = msg.Header;
40      retMsg.Timestamp = DateTime.Now;
41      retMsg.Expiration = DateTime.Now.AddDays(1);
42
43      return retMsg;
44    }
45  }
46
47  public class HelloWorldService : BaseAutoService
48  {
49    public HelloWorldService(IServiceMQ mq) : base("demo.helloworld", mq)
50    {
51    }
52
53    protected override ResponseMessage Run(RequestMessage msg)
54    {
55      Parameter[] parms = msg.Parameters;
56      ResponseMessage retMsg = new ResponseMessage();
57      retMsg.ServiceName = msg.ServiceName;
58      retMsg.MessageId = Guid.NewGuid();
59      retMsg.TransactionId = msg.TransactionId;
60      retMsg.RequestHeader = msg.Header;
61      retMsg.Timestamp = DateTime.Now;
62      retMsg.Expiration = DateTime.Now.AddDays(1);
63
64      retMsg.Text = "hello world";
65      retMsg.Bytes = System.Text.UTF8Encoding.UTF8.GetBytes(retMsg.Text);
66      retMsg.Data = new System.Data.DataSet("hello world data");
67
68      return retMsg;
69    }
70  }

时间: 2024-12-24 17:10:38

使用NBear.MQ分布式服务消息队列模块开发分布式系统的相关文章

大型网站架构系列:分布式消息队列(一) (转)

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统). 本次分享大纲 消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务(见第二篇:大型网站架构系列:分布式消息队列(二)) 常用消息队列(见第二篇:大型网站架构系列:分布式消息队列(二)) 参考(推荐)资料(见第二篇:大型网站架构系列:分布式消息队列(二)) 本次分享总结(见第二篇:大型网站架构系列:分布式消息队列(二)) 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要

大型网站架构系列:分布式消息队列(一)

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统). 本次分享大纲 消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务(见第二篇:大型网站架构系列:分布式消息队列(二)) 常用消息队列(见第二篇:大型网站架构系列:分布式消息队列(二)) 参考(推荐)资料(见第二篇:大型网站架构系列:分布式消息队列(二)) 本次分享总结(见第二篇:大型网站架构系列:分布式消息队列(二)) 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要

消息队列(MQ)重磅推出MQTT移动物联套件

消息队列(MQ)可应用在多个领域,包括异步通信解耦.企业解决方案.金融支付.电信.电子商务.快递物流.广告营销.社交.即时通信.移动应用.手游.视频.物联网.车联网等.近期,消息队列(MQ)推出顺序消息消息.MQTT移动物联套件.Kafka企业级消息服务.下述内容将解析消息队列(MQ)顺序消息.车联网.Kafka企业级消息服务的应用场景. 1. 消息类型及多种场景 消息队列支持多种消息类型: 普通消息:最大4M,消息越小,性能越高 事务消息:两阶段提交.解决分布式事务问题 定时消息:消息的延时或

大话消息队列的流派之争

这篇文章的标题很难起,网上一翻全是各种MQ的性能比较,很容易让人以为我也是这么"粗俗"的人.我这篇文章想要表达的是--它们根本不是一个东西,有毛的性能好比较?   MQ是什么?    Message Queue(MQ),消息队列中间件.很多人都说:MQ通过将消息的发送和接收分离来实现应用程序的异步和解偶,这个给人的直觉是--MQ是异步的,用来解耦的,但是这个只是MQ的效果而不是目的.   MQ真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层的.更加简单的通讯协议.一个分布

PHP高级编程之消息队列

PHP高级编程之消息队列 http://netkiller.github.io/journal/php.mq.html Mr. Neo Chen (陈景峰), netkiller, BG7NYT 中国广东省深圳市龙华新区民治街道溪山美地518131+86 13113668890+86 755 29812080<netkiller@msn.com> 版权声明 转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明. 文档出处: http://netkiller.github.io ht

KiteQ —— 基于 go + protobuff 的消息队列

KiteQ 是一个基于 go + protobuff 实现的多种持久化方案的 mq 框架(消息队列). 特性: * 基于zk维护发送方.订阅方.broker订阅发送关系.支持水平.垂直方面的扩展 * 基于与topic以及第二级messageType订阅消息 * 基于mysql.文件存储方式多重持久层消息存储 * 保证可靠异步投递 * 支持两阶段提交分布式事务 工程结构: kiteq/ ├── README.md ├── binding 订阅关系管理处理跟ZK的交互 ├── build.sh 安装

enode框架入门:消息队列的设计思路

上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architecture的思 想.通过前一篇文章,我们知道了enode内部有两种队列:command queue.event queue:用户发送的command 会进入command queue排队,domain model产生的domain event会进入event queue,然后等待被dispatch到所 有的event handlers.本文介绍一下enode框架中这两种消息队列到底

ENode 1.0 - 消息队列的设计思路

开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architecture的思想.通过前一篇文章,我们知道了enode内部有两种队列:command queue.event queue:用户发送的command会进入command queue排队,domain model产生的domain event会进入event queue,然后等待被dispatch到所有的

WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ

之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识 (1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的 基础文章.在那篇文章里,我们详细介绍了MSMQ消息队列的基本概念.安装.部 署.开发.调试等相关问题.今天我们来学习WCF分布式开发步步为赢(13):WCF 服务离线操作与消息队列MSMQ.在WCF框架下使用MSMQ消息队列服务编程. 这 里我会给出一个使用WCF MSMQ实现离线请求的DEMO示例程序. 全文结构是:[1]MSMQ基本概念