当前位置:文档之家› C#使用NBear.MQ分布式服务消息队列模块开发分布式系统

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

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

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

下载

从https://www.doczj.com/doc/69499603.html,下载NBear_v1.8.0(包括全部框架及示例源码):https://www.doczj.com/doc/69499603.html,/projects/nbear/

如果你只想先体验一下已编译的示例程序,您也可以从这里下TestServiceMQ_bin.zip :https://www.doczj.com/doc/69499603.html,blogs. com/teddyma/TestServiceMQ_bin.zip

(请按如下顺序执行bin中的代码:TestRemotingServer.exe, TestServiceHost.exe,TestClientApp. exe,ServiceHost和Client可以是多个,server将自动随机分配调用service的请求到各个service ho st进行处理)

注:示例程序会使用本机的8000端口,如果本机8000端口已被占用或被禁用,请修改代码以使用其它端口代替或先启用8000端口。

解析

1、TestRemotingServer

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

1class Program

2 {

3static void Main(string[] args)

4 {

5 MemoryServiceMQ mq = new MemoryServiceMQ();

6 mq.OnLog = new LogHandler(Console.WriteLine);

7 RemotingServiceHelper rh =

8new RemotingServiceHelper(RemotingChannelType.TCP, "127.0.0.1", 8000, new LogHandle r(Console.WriteLine));

9 rh.PublishServiceInstance("MMQ", typeof(IServiceMQ), mq, System.Runtime.Remoting.WellKn ownObjectMode.Singleton);

10

11while (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,MathServic e和HelloWorldService,如下:

1public class MathService : BaseAutoService

2 {

3public MathService(IServiceMQ mq)

4 : base("demo.math", mq)

5 {

6 }

7

8private int getResult(char op, int x, int y)

9 {

10int rt = 0;

11switch (op)

12 {

13case '+':

14 rt = x + y;

15break;

16case '-':

17 rt = x - y;

18break;

19case '*':

20 rt = x * y;

21break;

22case '/':

23 rt = x / y;

24break;

25

26 }

27return rt;

28 }

29

30protected override ResponseMessage Run(RequestMessage msg)

31 {

32 Parameter[] parms = msg.Parameters;

33int 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

43return retMsg;

44 }

45 }

46

47public class HelloWorldService : BaseAutoService

48 {

49public HelloWorldService(IServiceMQ mq) : base("demo.helloworld", mq)

50 {

51 }

52

53protected 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

68return retMsg;

69 }

70 }

大家可以看到,这里的service都是从BaseAutoService继承的,您也可以实现IService或继承BaseSer vice。一个可以被NBear.MQ使用的Service基本上做的事情就是接受一个RequestMessage类型的输入参数,返回一个ResponseMessage类型的返回结果。

RequestMessage和ResponseMessage都从Message类型继承,除了包含请求和返回相关的一组参数(.net 基本数据类型),每个Message包含Text、Bytes和Data属性,分别允许存放和传递string,byte[]和D ataset类型的数据。可见Message实际是一个比较通用的DTO。

下面,我们要将示例service注册到server,这个过程可以非常方便的通过SimpleServiceContainer来实现:

1class Program

2 {

3static void Main(string[] args)

4 {

5 IServiceMQ mq = new RemotingClientHelper(RemotingChannelType.TCP, "127.0.0.1", 800

0, 0, new LogHandler(Console.WriteLine)).GetClientInstance("MMQ");

6 IServiceContainer container = new SimpleServiceContainer(mq);

7

8 container.RegisterComponent("math host 1", typeof(MathService));

9 container.RegisterComponent("math host 2", typeof(MathService));

10 container.RegisterComponent("helloworld 1", typeof(HelloWorldService));

11

12while (Console.ReadLine() != "q")

13 {

14 }

15 }

16 }

您可以看到,我们首先要通过RemotingClientHelper类获得我们的server发布出来的mq实例。然后,创建一个SimpleServiceContainer实例,并将我们的示例service添加到container,就这么简单。Simple SeviceContainer会自动为我们注册和绑定service和mq,您也可以注册多个相同和不同类型的service 到container。

3、TestClientApp

Client是一个WinForm程序,自然就是调用Service了。代码如下:

1using System;

2using System.Collections.Generic;

3using https://www.doczj.com/doc/69499603.html,ponentModel;

4using System.Data;

5using System.Drawing;

6using System.Text;

7using System.Windows.Forms;

8

9using NBear.MQ.ServiceMQ;

10using NBear.MQ;

11using https://www.doczj.com/doc/69499603.html,mon;

12using https://www.doczj.com/doc/69499603.html,mon.Remoting;

13

14namespace TestClientApp

15{

16public partial class Form1 : Form

17 {

18public Form1()

19 {

20 InitializeComponent();

21 }

22

23private void Form1_Load(object sender, EventArgs e)

24 {

25 comboOP.SelectedIndex = 0;

26

27 rh = new RemotingClientHelper(RemotingChannelType.TCP, "127.0.0.1", 8000, 0, new LogHa ndler(Console.WriteLine));

28 mq = rh.GetClientInstance("MMQ");

29 mq.OnLog = new LogHandler(Console.WriteLine);

30 container = new SimpleServiceContainer(mq);

31 }

32

33private void txtX_TextChanged(object sender, EventArgs e)

34 {

35 txtResult.Text = string.Empty;

36 }

37

38private void comboOP_SelectedIndexChanged(object sender, EventArgs e)

39 {

40 txtResult.Text = string.Empty;

41 }

42

43private void txtY_TextChanged(object sender, EventArgs e)

44 {

45 txtResult.Text = string.Empty;

46 }

47

48 RemotingClientHelper rh = null;

49 IServiceMQ mq = null;

50 IServiceContainer container = null;

51

52private void btnCompute_Click(object sender, EventArgs e)

53 {

54try

55 {

56int.Parse(txtX.Text);

57if (comboOP.SelectedIndex == 3)

58 {

59if (int.Parse(txtY.Text) != 0)

60 {

61 }

62 }

63else

64 {

65int.Parse(txtY.Text);

66 }

67 }

68catch

69 {

70 MessageBox.Show("x, y must be number, and y must not be 0 when OP is '/'!");

71return;

72 }

73

74 RequestMessage msg = new RequestMessage();

75 msg.Expiration = DateTime.Now.AddDays(1);

76 msg.MessageId = Guid.NewGuid();

77 msg.Parameters = new Parameter[] { new Parameter("op", comboOP.Text), new Parameter ("x", int.Parse(txtX.Text)), new Parameter("y", int.Parse(txtY.Text)) };

78 msg.ServiceName = "demo.math";

79 msg.Timestamp = DateTime.Now;

80 msg.TransactionId = Guid.NewGuid();

81

82 ResponseMessage retMsg = container.CallService(msg.ServiceName, msg);

83

84if (retMsg != null)

85 {

86 txtResult.Text = retMsg.Parameters[0].Value.ToString();

87 }

88else

89 {

90 MessageBox.Show("Call service failed!");

91 }

92 }

93

94private void btnHelloWorld_Click(object sender, EventArgs e)

95 {

96 RequestMessage msg = new RequestMessage();

97 msg.Expiration = DateTime.Now.AddDays(1);

98 msg.MessageId = Guid.NewGuid();

99 msg.ServiceName = "demo.helloworld";

100 msg.Timestamp = DateTime.Now;

101 msg.TransactionId = Guid.NewGuid();

102

103 msg.Text = "who r u?";

104

105 ResponseMessage retMsg = container.CallService(msg.ServiceName, msg);

106

107 MessageBox.Show(retMsg.Text);

108 }

109 }

110}

Line 23-31 在Form Load是初始化container,这和service host是完全一样的。

调用service只需通过container.CallService方法,如Line 82 和 105。

问题

1、您可能会问,client的代码除了调用service和service host的代码几乎相同,那么是否可以在client 中既使用service又提供service呢?当然可以,你也完全可以在client这里register service,当client调用一个service时,container会首先检查是否存在本地service,存在则调用本地,不存在则向server请求远程service。

2、本示例是在一台服务器上演示这个分布式构架,您也可以修改地址,并分别把server, service host 和client部署到互相连接的多台server上。

运行

请按如下顺序执行bin中的代码:TestRemotingServer.exe, TestServiceHost.exe,TestClientApp.exe,ServiceHost和Client可以是多个,server将自动随机分配调用service的请求到各个service host进行处理。在运行过程中,请尝试多次点击client的按钮,并观察,server和service host的日志,看是不是负载均衡。您也可以尝试在运行过程中关闭某些service host或client,或者再新增一些,注意server 会自动维护service host和client的绑定和回调。

致谢

NBear.MQ很多地方参考了alex兄的QPG分布式构架(https://www.doczj.com/doc/69499603.html,/),并得到了alex兄的许多指点,在此表示最高的谢意!

消息队列(Message Queue)简介及其使用

消息队列(Message Queue)简介及其使用 利用MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防故障方法。 MSMQ与XML Web Services和.Net Remoting一样,是一种分布式开发技术。但是在使用XML Web Services或.Net Remoting组件时,Client端需要和Server端实时交换信息,Server 需要保持联机。MSMQ则可以在Server离线的情况下工作,将Message临时保存在Client 端的消息队列中,以后联机时再发送到Server端处理。 显然,MSMQ不适合于Client需要Server端及时响应的这种情况,MSMQ以异步的方式和Server端交互,不用担心等待Server端的长时间处理过程。 虽然XML Web Services和.Net Remoting都提供了[OneWay]属性来处理异步调用,用来解决Server端长方法调用长时间阻碍Client端。但是不能解决大量Client负载的问题,此时Server 接受的请求快于处理请求。 一般情况下,[OneWay]属性不用于专门的消息服务中。 1. 基本术语和概念(Basic terms and concepts ) “消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。 消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。“消息队列”是Microsoft 的消息处理技术,它在任何安装了Microsoft Windows 的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。 “消息队列网络”是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。 “消息队列”安装期间,管理员确定哪些服务器可以互相通信,并设置特定服务器的特殊角色。构成此“消息队列”网络的计算机称为“站点”,它们之间通过“站点链接”相互连接。每个站点

RocketMq消息队列实施计划方案-完整版

消息队列实施方案 1、背景 异步解耦合、给前端系统提供最高效的反应 2、常见消息队列对比 2、1 ActiveMq ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规的JMS Provider实现 优点: Java语言 支持集群模式 缺点: 性能在消息中间件中处于下游 2、2 Rabbitmq Rabbitmq是基于AMQP使用erlang语言实现的消息队列系统 优点: 1、完整的消息队列系统,支持多种消息队列模式,包括竞争消费; 2、支持集群模式,扩展集群容量和性能比较方便,集成了集群的监控和管理; 3、支持消息的持久化; 缺点: 1、需要学习比较复杂的接口和协议,比较耗费时间; 2、性能不是特别理想大概在1wqps左右; 3、使用Erlang语言,语言基础; 2、3 Kafka Kafka 是LinkedIn 开发的一个高性能、分布式的消息发布订阅系统。 优点: 1、分布式集群可以透明的扩展,增加新的服务器进集群。 2、高性能。单机写入TPS约在百万条/秒 3、容错。数据都会复制到几台服务器上。 缺点: 1、复杂性。Kafka需要zookeeper 集群的支持,T opic通常需要人工来创建,部署和维护较一般消息队列成本更高

定位于日志传输、存在消息丢失的肯能、消息乱序 3、消息发送错误无重试 2、4 RocketMQ RockerMq 是阿里公司中间件团队参考Kafka思想,用Java语言实现的消息传输系统 优点: 1、较高性能,单机写入TPS单实例约7万条/秒 2、容错,多种集群模式、可以解决容错问题 3、消息重试发送 4、顺序消息可以严格执行 缺点: 1、消息重复、消费端需要做去重操作 2、5 选用结论 从项目业务与团队技术偏向考虑,我们应该需要一种数据安全性比较高,保证每个消息都会被执行;有容错机制、支持集群模式高可用;性能不错,可以在毫秒级处理消息;支持顺序消息的消息中间件,RockerMq 可以满足这些要求。 3、RockerMq简介 3、1 RockerMq 产品介绍 参考阿里公司提供的《RocketMQ 开发指南》,最新版针对v3.2.4 3、2 RockerMq集群 3、2、1 部署方式 Rockermq共有四种部署方式,分别是: 1、单个Master 一旦Broker 重启或者宕机时,会导致整个服务不可用 2、多Master 模式 一个集群无Slave,全是Master,例如2 个Master 戒者3 个Master 优点: 1、配置简单, 2、容错,单个Master 宕机或重启维护对应用无影响,在磁盘配置为RAID10 时,即使机器宕机不可恢复情况下,由于RAID10 磁盘非常可靠,在同步刷盘时消息不会丢,异步刷盘丢失少量消息, 3、性能最高。

分布式队列

MemcacheQ RabbitMQ AMQP 里主要要说两个组件:Exchange 和Queue (在AMQP 1.0 里还会有变动),如下图所示,绿色的X 就是Exchange ,红色的是Queue ,这两者都在Server 端,又称作Broker ,这部分是RabbitMQ 实现的,而蓝色的则是客户端,通常有Producer 和Consumer 两种类型: 1、优点 1)支持很多的协议:AMQP,XMPP, SMTP, STOMP 2)消息发布与消费方式比较齐全

消息队列中只要的两个角色是exchange和queue。RabbitMQ中的Exchanger包括:direct exchanger实现点对点传输;fanout exchanger实现一对多的广播传输;topic exchanger实现 pub/sub传输。 3)有监控插件支持 2、不足 1)部署以及分布式支持比较复杂 2)分布式的调用支持不是很好,负载均衡 3)支持的协议的概念比较多,且基于Erlang实现。 4)在高并发的情况下,比较慢,内存占用较多 RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。 Beanstalkd Beanstalk 是一个简单、快速的工作队列。(轻量级) 其接口是通用的,但其初衷是把一些耗时操作异步化,从而降低大访问量web应用页面访问的延迟。 Beanstalk is a simple, fast work queue. Its interface is generic, but was originally designed for reducing the latency of page views in high-volume web applications by running time-consuming tasks asynchronously. 一、协议 Beanstalkd的协议类似memached。 二、核心概念 1、Tube

MQ介绍与选型

MQ介绍与选型 MQ使用场景 ?异步通信 有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。 ?解耦 降低工程间的强依赖程度,针对异构系统进行适配。在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。通过消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,当应用发生变化时,可以独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 ?冗余 有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。 ?扩展性 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。便于分布式扩容。 ?过载保护

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量无法提取预知;如果以为了能处理这类瞬间峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。 ?可恢复性 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。 ?顺序保证 在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。 ?缓冲 在任何重要的系统中,都会有需要不同的处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流经过系统的速度。 以调节系统响应时间。 ?数据流处理 分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,然后进行大数据分析是当前互联网的必备技术,通过消息队列完成此类数据收集是最好的选择。

中间件消息通信技术概要

中间件消息通信技术概要 一、中间件 中间件,就是介于应用系统与系统软件之间的一类软件,它使用系统软件所提供的基础功能,衔接于应用系统的不同部分,能够达到资源共享和功能共享的目的。 消息中间件,是中间件众多产品分类中一个重要部分。它能够适用于任何需要进行网络通信的系统,负责建立网络通信的通道,进行数据或文件发送。消息中间件的一个重要作用是可以实现跨平台操作,为不同操作系统上的应用软件集成提供服务。 二、几种通信技术的比较 1、CPI-C CPI-C是一种同步对话通信模式。参加通信的一方发起一次对话,同时控制信息流动。数据既可以由发送者传递到接受者,也可以反向流动。 参加通信的两个程序需要跟踪对话的状态,如果异常发生导致连接中断,则需要发送方重建并恢复这次通话。通信双方既可以处于主从地位,也可以处于对等地位。也就是说,CPI-C既支持客户端-服务器环境,也支持对等通信方式。 虽然CPI-C在一般情况下是一种同步通信类型,但是在一定环境中,如CIC S,可以通过“临时数据队列”实现一定程度的异步。 TCP/IP,SNA都支持CPI-C。 由于需要应用程序参与错误的检测与恢复,CPI-C的编程接口相当复杂。

2、RPC RPC,即远程过程调用,也是一种同步,对话方式的类型。一个调用程序向服务器提成申请,该调用被负责通信的转接器发往远端系统。调用者与被调用者关系是固定的,很难实现对等通信。 与CPI-C一样,通信错误需要应用程序自己维护。另外在申请服务得到响应之前,服务申请者被阻隔,这不仅是应用的瓶颈所在,更有可能遭受拒绝式服务攻击。 3、MQI(Message Queue Interface) 消息队列接口为程序提供了一种异步通信方式。一个程序以一个队列作为中转与另一个程序相互通信,这个队列向对于该程序而言既可以是本地,也可以是远程。当程序A与程序B进行通信时,A只需要将消息放入一条与B相通信的队列即可,至于消息何时,以何种协议,何种方式到达程序B与A没有关系。底层的通信细节被接口所覆盖,甚至通信错误的恢复也由队列管理器代劳了,应用程序自身感受不到通信的发生。 由于通信方式和使用的协议无关,因而可以使用各种标准协议,比如TCP/I P,SNA或者其他局域网协议。 当程序A向B发送消息的时候,程序B不需要处于运行状态,消息队列负责了消息的转达。而且一个程序可以通过不同的队列与多个程序进行通信。

RocketMq消息队列实施方案-完整版

RocketMq消息队列实施方案-完整版

消息队列实施方案 1、背景 异步解耦合、给前端系统提供最高效的反应 2、常见消息队列对比 2、1 ActiveMq ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现 优点: Java语言 支持集群模式 缺点: 性能在消息中间件中处于下游 2、2 Rabbitmq Rabbitmq是基于AMQP使用erlang语言实现的消息队列系统 优点: 1、完整的消息队列系统,支持多种消息队列模式,包括竞争消费;

2、支持集群模式,扩展集群容量和性能比较方便,集成了集群的监控和管理; 3、支持消息的持久化; 缺点: 1、需要学习比较复杂的接口和协议,比较耗费时间; 2、性能不是特别理想大概在1wqps左右; 3、使用Erlang语言,语言基础; 2、3 Kafka Kafka 是LinkedIn 开发的一个高性能、分布式的消息发布订阅系统。 优点: 1、分布式集群可以透明的扩展,增加新的服务器进集群。 2、高性能。单机写入TPS约在百万条/秒 3、容错。数据都会复制到几台服务器上。 缺点: 1、复杂性。Kafka需要zookeeper 集群的支持,Topic通常需要人工来创建,部署和维护较

一般消息队列成本更高 定位于日志传输、存在消息丢失的肯能、消息乱序 3、消息发送错误无重试 2、4 RocketMQ RockerMq 是阿里公司中间件团队参考Kafka 思想,用Java语言实现的消息传输系统 优点: 1、较高性能,单机写入TPS单实例约7万条/秒 2、容错,多种集群模式、可以解决容错问题 3、消息重试发送 4、顺序消息可以严格执行 缺点: 1、消息重复、消费端需要做去重操作 2、5 选用结论 从项目业务与团队技术偏向考虑,我们应该需要一种数据安全性比较高,保证每个消息都会被执行;有容错机制、支持集群模式高可用;性能不错,可以在毫秒级处理消息;支持顺序消息的消息中间件,RockerMq 可以满足这些要求。

分布式架构知识体系

1.问题 1、何为分布式何为微服务? 2、为什么需要分布式? 3、分布式核心理论基础,节点、网络、时间、顺序,一致性? 4、分布式是系统有哪些设计模式? 5、分布式有哪些类型? 6、如何实现分布式? 2.关键词 节点,时间,一致性,CAP,ACID,BASE,P2P,机器伸缩,网络变更,负载均衡,限流,鉴权,服务发现,服务编排,降级,熔断,幂等,分库分表,分片分区,自动运维,容错处理,全栈监控,故障恢复,性能调优 3.全文概要 随着移动互联网的发展智能终端的普及,计算机系统早就从单机独立工作过渡到多机器协作工作。计算机以集群的方式存在,按照分布式理论的指导构建出庞大复杂的应用服务,也已经深入人心。本文力求从分布式基础理论,架构设计模式,工程应用,部署运维,业界方案这几大方面,介绍基于MSA(微服务架构)的分布式的知识体系大纲。从而对SOA 到MSA进化有个立体的认识,从概念上和工具应用上更近一步了解微服务分布式的本质,身临其境的感受如何搭建全套微服务架构的过程。

4.基础理论 4.1SOA到MSA的进化 SOA面向服务架构 由于业务发展到一定层度后,需要对服务进行解耦,进而把一个单一的大系统按逻辑拆分成不同的子系统,通过服务接口来通讯,面向服务的设计模式,最终需要总线集成服务,而且大部分时候还共享数据库,出现单点故障的时候会导致总线层面的故障,更进一步可能会把数据库拖垮,所以才有了更加独立的设计方案的出现。 MSA微服务架构

微服务是真正意义上的独立服务,从服务入口到数据持久层,逻辑上都是独立隔离的,无需服务总线来接入,但同时增加了整个分布式系统的搭建和管理难度,需要对服务进行编排和管理,所以伴随着微服务的兴起,微服务生态的整套技术栈也需要无缝接入,才能支撑起微服务的治理理念。 4.2节点与网络 节点 传统的节点也就是一台单体的物理机,所有的服务都揉进去包括服务和数据库;随着虚拟化的发展,单台物理机往往可以分成多台虚拟机,实现资源利用的最大化,节点的概念也变成单台虚拟机上面服务;近几年

分布式应用的各基本领域及开发技术概要

分布式应用的各基本领域及开发技术概要 分布式系统技术概要 现在互联网应用,尤其是大型互联网公司的应用已经发展为大规模或超大规模的分布式的,集群化的应用。而中小规模的分布式应用也已广泛出现在各个领域。未来,随着云计算向社会生活的方方面面去渗透,分布式应用将更加地普及。所以,任何一个要从事服务器端应用开发的人员,都有具备对分布式应用的基本认识。 本文将简要介绍分布式应用的各基本领域的相关技术。这些技术在一个分布式应用中都会有或多或少的设计,即便暂时没有涉及到,设计人员也要有所考虑,保证系统有进一步发展的空间。 1. 集群管理 关键字:Apache Zookeeper、Paxos 算法、Etcd、Raft、Apache Curator 在一个分布式系统中,存在着一些和系统运行,以及重要业务紧密相关的数据,如节点相关的数据、应用服务和数据服务相关的数据等,这些数据对集群的正常运行至关重要。 ?服务器节点相关数据:服务器的地址、状态 ?服务相关数据:服务的IP、端口、版本、协议、状态、主备节点信息?数据库相关数据:路由规则、分库分表规则 这些重要的数据在分布式系统中存在着多份拷贝,以保证高可用性。但这产生了另外一个问题,就是如何保证这些数据的一致性。因为这些数据是如此重要,不一致的数据会产生严重甚至致命的错误。在一个小规模的分布式系统中,因为可以用一两台服务器去做集群管理,所以数据的一致性容易实现。但是对于一个大规模的分布式系统,一两台集群配置管理服务器无法支撑整个集群所带来的大量并发读写操作,所以要使用几台、十几台,甚至更多的服务器去支撑这些请求。此时,就需要一个保持这些服务器中集群配置数据的一致性的方案了。 这众多方案中,Paxos 算法算是最佳方案之一。关于 Paxos 算法的内容,不在这里详述了。简单描述就是集群中各节点相互以提议的方式通信(对一项数据的修改),提议中带有不断增加的 ID 号,节点永远同意当前 ID 号最大的提议,并拒绝其它提议。当有半数以上节点同意一项提议之后,这个提议便被整个节点所接受并采纳。 1.1. Apache Zookeeper Paxos 算法的语言表述看上去不难,但是其中的技术难点并不少。好在现在已经有了很多的解决方案,其中最为著名的便是 Apache Zookeeper。Zookeeper 不仅可以用来存储配置数据,还可以用来实现集群 Master 选举、分布式锁等场景。

posix消息队列使用全面介绍

POSIX消息队列是linux进程间通信的重要方式,下面按照创建,使用,关闭的顺序讲述了POSIX消息队列的使用方法: 创建POSIX消息队列: mq_open #include mqd_t mq_open(const char *name,int oflag,int mode,mq_addr *attr); 参数说明: Name:消息队列的名字字符串,必须以’/’开头,否则会出错。 Oflag: 表示打开的方式, 1.首先必须说明读写方式,可以使以下的值之一: O_RDONLY:建立的队列是只读的 O_WRONLY:建立的队列是只写的 O_RDWR:建立的队列是可读可写 2.必须有O_CREATE,说明是创建消息队列。 3.还有可选的选项: O_NONBLOCK:说明在创建的队列上发送和接收消息时,如果没有资源,不会 等待,之间返回,如果不设置这个选项,缺省是会等待。 O_EXCL:在创建队列时,检测要创建的队列的名字是否已经存在了,如果已存 在,函数会返回出错 可以以或的方式形成Oflag,例如:O_RDWR|O_CREAT|O_EXCL Mode:是一个可选参数,在oflag中含有O_CREA T标志且消息队列不存在时,才需要提供该参数。表示默认的访问权限,这个权限和文件访问的权限是相同的,取值也 相同。 Mode可以由多个值组合而成,如:S_IRUSR|S_IWUSR,队列的所有者有读和 写的权限。 Attr:指向结构struct mq_attr的指针。我们可以在创建队列时通过这个结构设置队列的最大消息数和每个消息的最大长度。 struct mq_attr { long mq_flags; // 0或者O_NONBLOCK,说明是否等待

消息队列

学号: 嵌入式系统及应用 实验报告 消息队列 学生姓名 班级 成绩

简介 消息队列就象一个类似于缓冲区的对象,通过消息队列任务和ISR发送和接收消息,实现数据的通信和同步。消息队列具有一定的容量,可以容纳多条消息,因此可以看成是多个邮箱的组合。 1、实验目的 a)理解消息队列的基本原理,了解任务的各个消息队列基本状态及其变迁过程; b) 掌握μC/OS-II中消息队列管理的基本方法(创建、启动、挂起、解挂任务); c)熟练使用μC/OS-II消息队列管理的基本系统调用。 2、实验原理及程序结构 2.1 实验设计 为了说明如何使用消息队列来实现多任务接收数据,我们设计一个系统,按键一按下,LED按照指定节奏闪耀,蜂鸣器按照指定节奏鸣响。假设TaskLED为高优先级的任务,三个任务的处理流程如下。

TaskKEY任务主要代码如下。 LED任务的代码如下。

Beep任务主要代码如下。 源程序说明

1、需在以下文件中配置如下内容 OS_CFG.H OS_MAX_QS N 你需要的值 根据需要自己配置 #define OS_Q_EN 1 /* Enable (1) or Disable (0) code generation for QUEUES */ #define OS_Q_ACCEPT_EN 1 /* Include code for OSQAccept() */ #define OS_Q_DEL_EN 1 /* Include code for OSQDel() */ #define OS_Q_FLUSH_EN 1 /* Include code for OSQFlush() */ #define OS_Q_POST_EN 1 /* Include code for OSQPost() */ #define OS_Q_POST_FRONT_EN 1 /* Include code for OSQPostFront() */ #define OS_Q_POST_OPT_EN 1 /* Include code for OSQPostOpt() */ #define OS_Q_QUERY_EN 1 /* Include code for OSQQuery() */ 2、建立一个指向消息数组的指针和数组的大小,该指针数组必须申明为void类型,如下: void *MyArrayOfMsg[SIZE]; 3、声明一个OS_EVENT类型的指针指向生成的队列,如下: OS_EVENT *QSem; 4、调用OSQcreate()函数创建消息队列,如下: QSem = OSQcreate(&MyArrayOfMsg[0],SIZE); 5、等待消息队列中的消息,OSQPend()。void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err): 必须保证消息队列已经被建立。 timeout定义的是等待超时时间,如果为0则表示无期限的等待 err表示的是在等待消息队列出错时的返回类型,有以下几种: OS_ERR_PEVENT_NULL //消息队列不存在 OS_ERR_EVENT_TYPE OS_TIMEOUT //消息队列等待超时 OS_NO_ERR //消息队列接收到消息 获得消息队列示例 type *GETQ; INT8U err; GETQ = (type *)OSQPend(QSem, time, &err); if(err == OS_NO_ERR){ 无错处理 } else{ 出错处理 } 6.1 向消息队列发送一则消息(FIFO),OSQPost(); INT8U OSQPost (OS_EVENT *pevent, void *msg): 函数返回值有: OS_ERR_PEVENT_NULL OS_ERR_POST_NULL_PTR OS_ERR_EVENT_TYPE OS_Q_FULL OS_NO_ERR 参数:pevent,*msg

Posix消息队列

Linux3+1暑期学习总结三(Posix消息队列) ---王晶晶 一,消息队列简介: 消息队列可以看作是一个消息连表。它具有随内核的持续性,即当使用该消息队列的进程结束,或者已关闭该消息队列,该队列中的消息不会随之消失,只有在内核重新初始化,即计算机重启之后才会消失,因此称为随内核的持续性,这点也是与管道和FIFO的区别。消息队列的另一个特性是,在某一个进程往消息队列写消息之前不需要另外某个进程在该消息队列上等待消息的到达,即不会像管道个FIFO那样,如果往管道或者FIFO中些数据时,如果没有一个进程已经将读端打开,那么写操作会被阻塞。当然,如果从消息队列读取数据时,消息队列为空是会阻塞的。 每个消息都是一条记录,它有发送者赋予一个优先权,值越大优先级越高。 下图为一个消息队列可能的布局: 该链表的头中含有当前队列的两个属性:队列中允许的最大消息数,每个消息的最大大小。 二,相关函数解释: 1.m q_open 所在头文件:#include 函数原型:mqd_t mq_open(const char *name, int 0flag,...

mode_t mode, struct mq_attr *attr); 函数功能:创建消息队列。 参数说明:name为消息队列的名字,根据消息队列的规则,为了更好的可移植性,该名字必须以…/?开头,创建一个消息队列的时候无须路径,给出名字就好,其存放位置可有自己指定(创建前后都可以,下面会讲到)。 oflag:为O_RDONLY(只读),O_WRONLY(只写),O_RDWR(可读可写)之一,可能安位或上O_CREATE,O_EXCL(当消息已存在时,返回EEXIST错误到errno中),O_NONBLOCK(设置非阻塞)。 mode和attr参数是可选,但是当实际操作是创建一个新队列时,即O_CREATE已指定,且要求创建的消息队列不存在,mode和attr参数是需要的。 mode:表示创建消息对列的权限。由 S_IRUSR,S_IWUSR,S_IXUSR,S_IRGRP,S_IWGRP,S_IXGRP,S_IROTH,S_IWOTH, S_IXOTH相或组成或者写成0777(表示rwxrwxrwx)等用八进制表示也可以。 attr:在linux内核源代码中struct_mqattr定义的源代码如下: 存放消息队列的属性。其中mq_flags为0,表示阻塞,为O_NONBLOCK为非阻塞。 函数返回值:在内核源代码中mqd_t类型的定义如下: typedef __kernel_mqd_t mqd_t; typedef int __kernel_mqd_t; 若创建成功则返回消息队列的描述符,否则返回-1。 2.mq_close函数:

基于开源分布式的业务系统技术架构研究

基于开源分布式的业务系统技术架构研究 作者:陈忠火 来源:《中国科技纵横》2020年第10期 摘要:随着现在业务系统的不断发展,如何长期保存日益增长及不断变化的数据成为人们面临的一大难题。IT行业现在也面临着巨大的挑战,很多机构为降低成本,适应当前的发展环境,共享技术成果,解决自身问题,大多使用分布式业务系统来保存数据,以此来适应快速变化的市场需求。随着分布式系统技术的日益发展,越来越多的机构为满足自身增长的业务需求,电信运营商如何利用开源分布式架构对业务系统进行了研究改造。本文分析研究了开源分布式的业务系统技术架构,旨在优化管理,实现契合业务的发展速度。 關键词:开源分布式;技术架构;业务系统 中图分类号:TP311.52 文献标识码:A 文章编号:1671-2064(2020)10-0067-02 0 引言 随着日益庞大的软件系统,单点应用模式已经无法满足当前业务系统的发展,因此就更加需要开源分布式的业务系统解决相应的难题,且该分布式系统拥有众多优点,避免了传统系统的弊端,现在该业务系统已然成为较多机构最受欢迎的架构模式。该系统不仅解决了之前应用系统的弊端,还将各组件应用到实际生产环境中。2014年,电信集团为改变封闭的业务系统缺点,对业务系统提出了建设性的要求,要求各地方公司实现IT互联网架构的横向扩展,该政策推动了IT行业架构开放化、互联网化的行业要求。 1 开源分布式架构的优点 1.1 学习的成本较低,使用简单 开源分布式的业务系统技术架构入门要求不高,且学习比较便捷,花费时间较短,能够即学即用,另外,该架构较为简单易上手,节约大量的学习时间及成本。随着分布式技术的发展,越来越多的行业使用了开源分布式架构作为自己系统的基础架构,对电信运营商或者电商的支持效果尤其明显。 1.2 便于测试且性能较高 开源分布式架构注重的主要是系统的功能性测试,因功能比较单一,故无需多次测试,且该构架性能较高,出现性能方面的瓶颈可能性较低,并对引入的相关依赖性也不高。低依赖性便于出现性能瓶颈的时候检测方便,整体的操作比较简单可行,功能性比较强。

阿里云消息队列(MQS)用户指南

阿里云消息队列服务(MQS)——入门指南

目录 1. Welcome (3) 2. 简介 (3) 2.1 MQS服务的特点 (3) 2.2 消息生命周期 (4) 3. 准备工作 (4) 3.1 注册并登陆 (5) 3.2获取公测资格并开通服务 (5) 3.2 Access Key ID和Access Key Secret (8) 3.4 通过管理控制台体验产品 (8) 3.5通过API或SDK使用产品 (8) 4.使用MQS (8) 4.1 CreateQueue (9) 4.2 SetQueueAttributes (10) 4.3 GetQueueAttributes (12) 4.4 DeleteQueue (14) 4.5 ListQueue (15) 4.6 SendMessage (16) 4.7 ReceiveMessage (18) 4.8 DeleteMessage (19) 4.9 PeekMessage (20) 4.10 ChangeMessageVisibility (21) 5. 用户反馈 (22)

1. Welcome 欢迎使用阿里云提供的消息队列服务(Message Queue Service,简称MQS)。 2. 简介 MQS是一种高效、可靠、安全、便捷、可弹性扩展的分布式消息队列服务。MQS能够帮助应用开发者在他们应用的分布式组件上自由的传递数据,构建松耦合系统。 2.1 MQS服务的特点 易用且不失扩展性:提供遵照RESTful标准的API访问接口,您无需担心任何兼容性题;可以和其他阿里云服务结合使用,例如ECS、RDS、和OSS,从而让您的应用程序更可靠、可扩展性更强。 丰富的队列属性配置:我们提供了丰富的队列属性配置选项,您可以进行队列属性的个性化配置来满足不同的应用场景,支持:普通队列、延迟队列、优先级队列等多种队列 模式。 支持并发访问:支持多个生产者和消费者并发访问同一个消息队列,并能确保某条消息在取出之后的特定时间段内,无法被其他消费者获得。 消息投递保障及访问控制:在消息有效期内,确保消息至少能被成功消费一次。接入阿里云账号体系,用户间资源隔离,确保您队列中的消息不会被非法获取。

消息队列架构设计

如果让你写一个消息队列,该如何进行架构设计?说一下你的思路。 其实聊到这个问题,一般面试官要考察两块: ?你有没有对某一个消息队列做过较为深入的原理的了解,或者从整体了解把握住一个消息队列的架构原理。 ?看看你的设计能力,给你一个常见的系统,就是消息队列系统,看看你能不能从全局把握一下整体架构设计,给出一些关键点出来。 说实话,问类似问题的时候,大部分人基本都会蒙,因为平时从来没有思考过类似的问题,大多数人就是平时埋头用,从来不去思考背后的一些东西。类似的问 题,比如,如果让你来设计一个Spring 框架你会怎么做?如果让你来设计一个Dubbo 框架你会怎么做?如果让你来设计一个MyBatis 框架你会怎么做? 其实回答这类问题,说白了,不求你看过那技术的源码,起码你要大概知道那个技术的基本原理、核心组成部分、基本架构构成,然后参照一些开源的技术把一个系统设计出来的思路说一下就好。 比如说这个消息队列系统,我们从以下几个角度来考虑一下: ?首先这个mq 得支持可伸缩性吧,就是需要的时候快速扩容,就可以增加吞吐量和容量,那怎么搞?设计个分布式的系统呗,参照一下kafka 的设计理念,broker -> topic -> partition,每个partition 放一个机器,就存一部分数据。如果现在资源不够了,简单啊,给topic 增加partition, 然后做数据迁移,增加机器,不就可以存放更多数据,提供更高的吞吐量 了?

?其次你得考虑一下这个mq 的数据要不要落地磁盘吧?那肯定要了,落 磁盘才能保证别进程挂了数据就丢了。那落磁盘的时候怎么落啊?顺序 写,这样就没有磁盘随机读写的寻址开销,磁盘顺序读写的性能是很高的,这就是kafka 的思路。 ?其次你考虑一下你的mq 的可用性啊?这个事儿,具体参考之前可用性那个环节讲解的kafka 的高可用保障机制。多副本-> leader & follower -> broker 挂了重新选举leader 即可对外服务。 ?能不能支持数据0 丢失啊?可以的,参考我们之前说的那个kafka 数据零丢失方案。 mq 肯定是很复杂的,面试官问你这个问题,其实是个开放题,他就是看看你有 没有从架构角度整体构思和设计的思维以及能力。确实这个问题可以刷掉一大批人,因为大部分人平时不思考这些东西。

消息队列介绍及原理

消息队列MQ技术的介绍和原理 (2010-03-14 00:00:00) 转载▼ 标签: 杂谈 消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。 消息中间件概述 消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。 在分布式计算环境中,为了集成分布式应用,开发者需要对异构网络环境下的分布式应用提供有效的通信手段。为了管理需要共享的信息,对应用提供公共的信息交换机制是重要的。 设计分布式应用的方法主要有:远程过程调用(PRC)--分布式计算环境(DCE)的基础标准成分之一;对象事务监控(OTM)--基于CORBA的面向对象工业标准与事务处理(TP)监控技术的组合;消息队列(MessageQueue)--构造分布式应用的松耦合方法。 (a)分布计算环境/远程过程调用(DCE/RPC) RPC是DCE的成分,是一个由开放软件基金会(OSF)发布的应用集成的软件标准。RPC模仿一个程序用函数引用来引用另一程序的传统程序设计方法,此引用是过程调用的形式,一旦被调用,程序的控制则转向被调用程序。 在RPC实现时,被调用过程可在本地或远地的另一系统中驻留并在执行。当被调用程序完成处理输入数据,结果放在过程调用的返回变量中返回到调用程序。RPC完成后程序控制则立即返回到调用程序。因此RPC模仿子程序的调用/返回结构,它仅提供了Client(调用程序)和Server(被调用过程)间的同步数据交换。 (b)对象事务监控(OTM) 基于CORBA的面向对象工业标准与事务处理(TP)监控技术的组合,在CORBA规范中定义了:使用面向对象技术和方法的体系结构;公共的Client/Server程序设计接口;多平台间传输和翻译数据的指导方针;开发分布式应用接口的语言(IDL)等,并为构造分布的 Client/Server应用提供了广泛及一致的模式。

消息队列的选型

目录 (1) 目录 1消息队列的概述 (2) 1.1消息的概念 (2) 1.2消息的队列的概念 (2) 1.3消息队列的概念 (3) 2AMQP (4) 2.1AMQP (4) 2.2AMQP历史 (4) 2.3AMQP的架构 (5) 2.4AMQP的概念 (5) 3常用消息队列选型 (7) 3.1RabbitMQ (7) 3.2ZeroMQ (8) 3.3Qpid (8) 3.4MetaQ (9) 3.5ActiveMQ (9) 3.6OpenMQ (11) 3.7MemcacheQ (12) 4队列参数比较 (14)

1消息队列的概述1.1消息的概念 1.消息的概念:消息是由通信双方所需要传递的信息,它可以是各式 各样的媒体,如文本、声音、图像等消息,最终的理解方式为,消 息传递的双方事先商定这样做的好处是:一是相当于对数据进行了 简单的加密,二采用自己定义的格式可以节省通信的传递量。 2.消息可以含有发送和接收者的标识,这样只有指定的用户才能看到 只传递给他的信息和返回是否操作成功的回执。 3.消息也可以含有时间戳,以便接收方对某些与时间相关的应用进行 处理消息,还可以含有到期时间,它表明如果在指定时间内消息还 未到达则此消息作废,这主要用于与时间性关联较为紧密的应用。 1.2消息的队列的概念 1.存储的概念:消息队列是发送和接收消息的公用存储空间,它可以 存在于内存中或者是物理文件中。 2.消息的发送方式:消息可以以两种方式发送,即快递方式和可恢复 模式,它们的区别在于,快递方式为了消息的快速传递把消息放置 于内存中,而不放于物理磁盘上,以获取较高的处理能力;可恢复 模式在传送过程的每一步骤中,都把消息写入物理磁盘中,以得到 较好的故障恢复能力。 3.消息队列的存贮所在:可以放置在发送方、接收方所在的机器上, 也可以单独放置在另外一台机器上。正是由于消息队列在放置方式 上的灵活性,形成了消息传送机制的可靠性。当保存消息队列的机 器发生故障而重新启动以后,以可恢复模式发送的消息,可以恢复 到故障发生之前的状态,而以快递方式发送的消息则丢失了。另一 方面,采用消息传递机制,发送方不要再担心接收方是否启动、是 否发生故障等非必要因素,只要消息成功发送出去就可以认为处理 完成。而实际上对方可能甚至未曾开机,或者实际完成时可能已经 是第二天了。 4.采用消息队列技术带来的好处是:由于是异步通信,无论是发送方 还是接收方都不用等待对方返回成功消息就可以执行余下的代码, 因而大大提高了事物处理的能力;在信息传送过程中,信息发送机 制具有一定功能的故障恢复能力;消息传递机制使得消息通信的双 方具有不同的物理平台成为可能。

大规模分布式系统架构与设计实战

简介 《大规模分布式系统架构与设计实战》从作者的实战经验出发,深入浅出地讲解了如何建立一个Hadoop那样的分布式系统,实现对多台计算机CPU、内存、硬盘的统一利用,从而获取强大计算能力去解决复杂问题。一般互联网企业的分布式存储计算系统都是个大平台,系统复杂、代码庞大,而且只适合公司的业务,工程师很难下载安装到自己的电脑里学习和吃透。本书对分布式核心技术进行了大量归纳和总结,并从中抽取出一套简化的框架和编程API进行讲解,方便工程师了解分布式系统的主要技术实现。这不是一本空谈概念、四处摘抄的书,这本书包含了大量精炼示例,手把手教你掌握分布式核心技术。 本书主要内容 分布式并行计算的基本原理解剖; 分布式协调的实现,包括如何实现公共配置管理,如何实现分布式锁,如何实现集群管理等; 分布式缓存的实现,包括如何提供完整的分布式缓存来利用多机内存能力; 消息队列的实现,包括如何实现发送和接收模式; 分布式文件系统的实现,包括如何像操作本地文件一样操作远程文件,并利用多机硬盘存储能力; 分布式作业调度平台的实现,包括资源隔离、资源调度等。 目录 第1章概述 1.1分布式计算、并行计算、云计算概述 1.2分布式产品Hadoop、ZooKeeper、HBase概述 1.3Fourinone的产生背景 第2章分布式并行计算的原理与实践 2.1分布式并行计算模式 2.1.1最初想到的master-slave结构 2.1.2“包工头-职介所-手工仓库-工人”模式 2.1.3基于消息中枢的计算模式 2.1.4基于网状直接交互的计算模式 2.1.5并行结合串行模式 2.1.6包工头内部批量多阶段处理模式 2.1.7计算集群模式和兼容遗留计算系统 2.1.8工人计算的服务化模式 2.2跟Hadoop的区别 2.3关于分布式的一些概念与产品 2.4配置文件和核心API介绍 2.5实践与应用 2.5.1一个简单的示例 2.5.2工头工人计算模式更完整的示例 2.5.3工人合并互相say hello的示例

消息队列的使用方法

uCOS II 消息队列的使用方法 需在以下文件中配置如下内容: OS_CFG.H OS_MAX_QS N 你需要的值 根据需要自己配置 #define OS_Q_EN 1 /* Enable (1) or Disable (0) code generation for QUEUES */ #define OS_Q_ACCEPT_EN 1 /* Include code for OSQAccept() */ #define OS_Q_DEL_EN 1 /* Include code for OSQDel() */ #define OS_Q_FLUSH_EN 1 /* Include code for OSQFlush() */ #define OS_Q_POST_EN 1 /* Include code for OSQPost() */ #define OS_Q_POST_FRONT_EN 1 /* Include code for OSQPostFront() */ #define OS_Q_POST_OPT_EN 1 /* Include code for OSQPostOpt() */ #define OS_Q_QUERY_EN 1 /* Include code for OSQQuery() */ 2、建立一个指向消息数组的指针和数组的大小,该指针数组必须申明为void类型,如下: void *MyArrayOfMsg[SIZE]; 3、声明一个OS_EVENT类型的指针指向生成的队列,如下: OS_EVENT *QSem; 4、调用OSQcreate()函数创建消息队列,如下: QSem = OSQcreate(&MyArrayOfMsg[0],SIZE); 5、等待消息队列中的消息,OSQPend()。void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err): 必须保证消息队列已经被建立。 timeout定义的是等待超时时间,如果为0则表示无期限的等待 err表示的是在等待消息队列出错时的返回类型,有以下几种: OS_ERR_PEVENT_NULL //消息队列不存在 OS_ERR_EVENT_TYPE OS_TIMEOUT //消息队列等待超时 OS_NO_ERR //消息队列接收到消息 获得消息队列示例 type *GETQ; INT8U err; GETQ = (type *)OSQPend(QSem, time, &err); if(err == OS_NO_ERR){ 无错处理 } else{ 出错处理 } 6.1 向消息队列发送一则消息(FIFO),OSQPost(); INT8U OSQPost (OS_EVENT *pevent, void *msg): 函数返回值有: OS_ERR_PEVENT_NULL OS_ERR_POST_NULL_PTR OS_ERR_EVENT_TYPE OS_Q_FULL

相关主题
文本预览
相关文档 最新文档