【ZeroMQ】消息模式

1、请求/应答模式(REP/REQ)

该模式特征:

  • 服务器使用REP类型套接字而客户端使用REQ类型套接字
  • 客户端发送请求和接收答复,而服务器则接收请求并发送答复
  • 客户端可以连接到一个或多个服务器。在这种情况下,请求会在所有的服务器(Reps)之间循环,一个请求被发送到某个服务器,下一个请求则被发送到下个服务器,如此进行下去。
  • 基于状态的模式:客户端在发送另一个请求之前,必须先接收前一个请求的答复。而服务器在接收另一个请求之前,必须答复前一个请求。

 1 //服务器端代码
 2         private static void Main(string[] args)
 3         {
 4             using (var context = ZContext.Create())
 5             {
 6                 using (var resp = new ZSocket(context, ZSocketType.REP))
 7                 {
 8                     resp.Bind("tcp://*:5555");
 9                     while (true)
10                     {
11                         ZFrame reply = resp.ReceiveFrame();
12                         string message = reply.ReadString();
13 
14                         Console.WriteLine("Receive message {0}", message);
15 
16                         resp.Send(new ZFrame(message));
17 
18                         if (message == "exit")
19                         {
20                             break;
21                         }
22                     }
23                 }
24             }
25         }
服务器端代码
 1 //客户端代码
 2         static void Main(string[] args)
 3         {
 4             using (var context = new ZContext())
 5             using (var requester = new ZSocket(context, ZSocketType.REQ))
 6             {
 7                 // Connect
 8                 requester.Connect("tcp://127.0.0.1:5555");
 9 
10                 while(true)
11                 {
12                     Console.WriteLine("Please enter your message:");
13                     string message = Console.ReadLine();
14                     requester.Send(new ZFrame(message));
15 
16                     // Send
17                     //requester.Send(new ZFrame(requestText));
18 
19                     // Receive
20                     using (ZFrame reply = requester.ReceiveFrame())
21                     {
22                         Console.WriteLine("Received: {0} {1}!", message, reply.ReadString());
23                         if ("exit" == reply.ReadString())
24                         {
25                             break;
26                         }
27                     }
28                 }
29             }
30         }
客户端代码

 

2、发布/订阅模式Publish/Subscribe(PUB/SUB)

该模式具有一下特征:

  • 发布者使用PUB类型套接字和订阅者则使用SUB类型套接字
  • 一个发布者可以有一个或者多个订阅者
  • 一个订阅者可以连接到一个或者多个发布者
  • 发布者发送消息而订阅者接收消息
  • 订阅者可以使用SubscribeAll方法订阅所有的发布者消息,可以使用Subscrube方法订阅某个特定的消息,这时要将所感兴趣的发布者的消息前缀作为参数。对消息的过滤发生在订阅者端,即发布者将其所有的消息发送给订阅者,而订阅者负责将不需要的消息丢弃。
  • 订阅者可以用UnsubscribeAll方法取消所有订阅,也可以使用Unsubscribe方法加上消息前缀来退订某个发布者。
  • 发布者将消息发送到已连接的所有订阅者。
  • 如果发布者没有和任何订阅者连接,那么消息将会被丢弃。
  • 如订阅者连接到多个发布者,那么它会均匀的接收所有发布者的消息(公平队列)。

 1 //发布者
 2         static void Publisher()
 3         {
 4             using (var context = new ZContext())
 5             using (var publisher = new ZSocket(context, ZSocketType.PUB))
 6             {
 7                 publisher.Bind("tcp://127.0.0.1:5555");
 8                 Random random = new Random();
 9                 while (true)
10                 {
11                     string message = string.Format("Random: {0}", random.Next(20));
12                     publisher.Send(new ZFrame(message));
13                     Console.WriteLine("Send:{0}", message);
14                     Thread.Sleep(1000);
15                 }
16             }
17         }
发布者
 1 //订阅者
 2         static void Subscribe()
 3         {
 4             using (var context = new ZContext())
 5             using (var subscribe = new ZSocket(context, ZSocketType.SUB))
 6             {
 7                subscribe.SubscribeAll();
 8                 subscribe.Connect("tcp://127.0.0.1:5555");
 9                 while (true)
10                 { 
11                    
12                     using (ZFrame replay = subscribe.ReceiveFrame())
13                     {
14                         Console.WriteLine("REceive: {0}", replay.ReadString());
15                     }
16                 }
17                 
18             }
19         }
订阅者

 

3、管道模式(Push/Pull)

当需要进行并行数据处理时,通常会用到该模式。管道模式使用场景如下所示:

  • 1.首先任务分发器通常以循环方式将消息(任务)推送给工作单元(每个工作单元有不同任务)
  • 2.接收到消息时工作单元会先对其进行处理,然后将它推送给接收消息(任务)的某种任务收集器。
  • 3.收集器以公平排队的方法从期连接的所有工作单元那接收消息。

该模式具有一下特征:

  • 任务分发器使用PUSH类型的套接字。它绑定到端点,并等待工作单元的连接。
  • 工作单元有两个套接字,一个使用PULL类型连接到任务分发器,另一个则是PUSH类型,负责和收集器的连接。
  • 任务收集器使用PULL类型套接字。它绑定到端点,并等待接收工作单元的连接。
posted @ 2015-09-01 16:43  芝麻学问  阅读(2926)  评论(0编辑  收藏  举报