1. 程式人生 > >nanomsg的pub/sub模式用法

nanomsg的pub/sub模式用法

作為一個MQ,pub/sub是非常常見的一個用法,nanomsg作為ZMQ的繼任,很少有部落格講述nanomsg的訂閱/釋出模式。

官方DEMO

#include <assert.h>
#include <libc.h>
#include <stdio.h>
#include <nanomsg/nn.h>
#include <nanomsg/pubsub.h>

#define SERVER "server"
#define CLIENT "client"

char *date ()
{
  time_t raw = time (&raw);
  struct tm *info = localtime (&raw);
  char *text = asctime (info);
  text[strlen(text)-1] = '\0'; // remove '\n'
  return text;
}

int server (const char *url)
{
  int sock = nn_socket (AF_SP, NN_PUB);
  assert (sock >= 0);
  assert (nn_bind (sock, url) >= 0);
  while (1)
    {
      char *d = date();
      int sz_d = strlen(d) + 1; // '\0' too
      printf ("SERVER: PUBLISHING DATE %s\n", d);
      int bytes = nn_send (sock, d, sz_d, 0);
      assert (bytes == sz_d);
      sleep(1);
    }
  return nn_shutdown (sock, 0);
}

int client (const char *url, const char *name)
{
  int sock = nn_socket (AF_SP, NN_SUB);
  assert (sock >= 0);
  // TODO learn more about publishing/subscribe keys
  assert (nn_setsockopt (sock, NN_SUB, NN_SUB_SUBSCRIBE, "", 0) >= 0);
  assert (nn_connect (sock, url) >= 0);
  while (1)
    {
      char *buf = NULL;
      int bytes = nn_recv (sock, &buf, NN_MSG, 0);
      assert (bytes >= 0);
      printf ("CLIENT (%s): RECEIVED %s\n", name, buf);
      nn_freemsg (buf);
    }
  return nn_shutdown (sock, 0);
}

int main (const int argc, const char **argv)
{
  if (strncmp (SERVER, argv[1], strlen (SERVER)) == 0 && argc >= 2)
    return server (argv[2]);
  else if (strncmp (CLIENT, argv[1], strlen (CLIENT)) == 0 && argc >= 3)
    return client (argv[2], argv[3]);
  else
    {
      fprintf (stderr, "Usage: pubsub %s|%s <URL> <ARG> ...\n",
               SERVER, CLIENT);
      return 1;
    }
}

我以官方DEMO來說明如何使用訂閱釋出

訂閱相關

assert (nn_setsockopt (sock, NN_SUB, NN_SUB_SUBSCRIBE, topic, length(topic)) >= 0);

說明:

    這裡推薦的TOPIC 型別是字串型別。一次訂閱只能訂閱一個TOPIC。

    如果你想訂閱兩個TOPIC,如"SHANGHAI", "BEIJING",訂閱兩次。

assert (nn_setsockopt (sock, NN_SUB, NN_SUB_SUBSCRIBE, "SHANGHAI", strlen(SHANGHAI)) >= 0);
assert (nn_setsockopt (sock, NN_SUB, NN_SUB_SUBSCRIBE, "BEIJING", strlen(BEIJING)) >= 0);

釋出相關

如何釋出一個內容?

int bytes = nn_send (sock, d, content, length(content));
上述虛擬碼說明如下

content是你想釋出的內容。

length(content)是釋出的內容的長度

如釋出上海的天氣

int bytes = nn_send (sock, d, "SHANGHAI|20'-25',SUN", strlen("SHANGHAI|20'-25',SUN");

上面釋出的內容接收方接收的資料的形式?

只有訂閱了

SHANGHAI***的訂閱方才能受到資料,我沒閱讀原始碼,估計釋出的內容會遍歷訂閱的話題,通配開頭內容相匹配的話題。---這樣的做法效能應該是不會很高的,但是可以適應多種訂閱業務的資料型別。

我感覺以字串做TOPIC,構建顯式的釋出介面,以如下形式提供更合理

pub(topic, content)

接收方以實現。

OnSub(topic, content)

這樣的方式可以用HASHMAP來管理TOPIC。

綜述

NANOMSG的訂閱釋出不是很高階。或者說,不是純粹的訂閱釋出業務型別。至少,沒有強制化樹立訂閱主題。每次釋出主題,需要遍歷通配所有的訂閱主題(效能有待提高)。

如果需要這樣強型別的主題,可以考慮ZMQ,需要注意的是,ZMQ的FILTER是在SUB端處理的,意味著所有的MSG都會推給所有的Suber方(非常欠缺),或者有空可以考慮自己實現一個。

參考連結

相關推薦

nanomsg的pub/sub模式用法

作為一個MQ,pub/sub是非常常見的一個用法,nanomsg作為ZMQ的繼任,很少有部落格講述nanomsg的訂閱/釋出模式。 官方DEMO #include <assert.h> #include <libc.h> #include <

C#中的IDisposable模式用法詳解

數據庫 nor 是否 entry block 記錄日誌 自定義 技術分享 ssa 本文實例講述了C#中IDisposable模式的用法,針對垃圾資源的回收進行了較為詳細的講解。分享給大家供大家參考之用。具體方法如下: 首先,對於垃圾回收而言,在C#中,托管資源的垃圾回收是

Linux常用基本命令:三劍客命令之-awk模式用法(1)

AC dot code 再次 end CA awk 運算 什麽 再次回顧一下,awk基本語法格式: awk [options] ‘Pattern {Action}‘ file1 file2 ··· 之前的文章有講過兩種Patte

ESP8266-3種模式用法

ESP8266有三種工作模式: 1.Station (客戶端模式) 2.AP (接入點模式) 3.Station+AP (兩種模式共存) 就是說模組可以當成一個裝置(client)連線區域網內的路由,也可以設定成是一個路由(sever),也可以既作為局域網裡面的client同時又是其他client的

Redis學習筆記~分散式的Pub/Sub模式

回到目錄 redis的客戶端有很多,這次用它的pub/sub釋出與訂閱我選擇了StackExchange.Redis,釋出與訂閱大家應該很清楚了,首先一個訂閱者,訂閱一個服務,服務執行一些處理程式(可能是寫個日誌,插入個數據,發個email)然後當另一個專案的某個業務釋出這個服務後,被訂閱的程式將會被執行,

Java Jedis操作Redis示例(一)——pub/sub模式實現訊息佇列

轉載:http://blog.csdn.net/shaobingj126/article/details/50585035 轉載:http://blog.csdn.net/abcd898989/article/details/51697596 一 訊息佇列 1. 定義 訊息

springmvc+spring+maven+ActiveMq之:PuB/Sub模式

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springfra

androidstudio之debug模式用法

使用環境:        在不知道程式在那個地方出問題的時候,需要進行一步步除錯發現問題的具體位置。 使用方法:       1 在app的build.gradle中新增允許執行debug模式的程

PHP單例模式和工廠模式用法例項詳解

設計模式是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使程式碼編制真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結

ActiveMQ兩種模式PTP和PUB/SUB<轉>

pub provide ops itl 通知 subscribe cin sdn cti 1.PTP模型 PTP(Point-to-Point)模型是基於隊列(Queue)的,對於PTP消息模型而言,它的消息目的是一個消息隊列(Queue),消息生產者每次發送消息總是把消

【7.13】單例模式(Singleton)的用法和用處以及破解單例

vol 創建者模式 code private let .get span test loaded 1):用處   是一種創建者模式,只生成一個實例對象,具有全局唯一性,當一個對象的產生需要比較多的資源時, 如讀取配置(如數據庫連接池、Spring中, 一個Compone

初學安卓開發隨筆之 Menu、toast 用法、活動的四種啟動模式 以及 一個方便的Base活動類使用方法

pro 一點 cte edi standard oid nal xtend 解釋 Toast toast 是安卓系統的一種非常棒的提醒方式 首先定義一個彈出Toast的觸發點,比如可以是按鈕之類 其中 Toast.LENGTH_SHORT是指顯示時長 還有一個內置變量為To

redis訂閱模式pub/sub

Pub/Sub:     "釋出/訂閱"在redis中,被設計的非常輕量級和簡潔,它做到了訊息的“釋出”和“訂閱”的     基本能力;但是尚未提供關於訊息的持久化等各種企業級的特性。       &

Smplayer命令列模式下的用法

用法: smplayer [-minigui] [-defaultgui] [-mpcgui] [-config-path 目錄] [-send-action 動作名稱] [-actions 動作列表] [-close-at-end] [-no-close-at-end] [-fullscreen]

php在cli模式下STDOUT、STDIN、$argv、$argc的用法

php在cli模式下STDOUT和STDIN變數的用法可以用如下程式碼來解釋: <?php //提示使用者輸入姓名 fwrite(STDOUT, "what's your name"); //獲取使用者輸入資料 $name = trim(fgets(STDIN)); //在客戶端輸

關於python 的re.sub用法

import re text = “JGood is a handsome boy, he is cool, clever, and so on…” print(re.sub(r’\s+’, ‘-’, text)) JGood-is-a-handsome-boy,-he-is-coo

linux系統下top命令的詳細用法、引數詳解、以及模式配置

用過linux系統的人都知道top命令,它是Linux下一個最常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,類似於Windows的工作管理員。 top顯示系統當前的程序和其他狀況,是一個動態顯示過程,即可以通過使用者按鍵來不斷重新整理當前狀態。如果在前臺執行該命令,它

關於工廠模式和單例模式的融合用法的個人見解

最近在思考spring程式碼如何降低記憶體消耗,減少物件建立的問題。後來想到使用工廠模式+單例模式來實現。此處就不貼程式碼了。直接介紹原理: 1,提供一個工廠類Factory,來提供一個統一的入口,讓APP統一從入口呼叫,獲取想要的類的物件。 2,為使用者提供的類的物件,

圖層知識,簡單講解一下27種圖層混合模式用法

圖層混合模式種類較多,即使一些老手也不完全瞭解,今天就跟大家講講,這二十七種混合模式的簡單用法。 嗯,讓我們從最最基礎的說起——畫素。你就把他當成一個個五顏六色的小色塊.這些小色塊們都有一個特定的標記值,比如,RGB值,CMYK值了。當然透明色塊也是畫素,不過

單例模式及getInstance()的用法

一般在單例模式下使用.getInstance()建立物件;但並不是所有有私有構造方法,對外通過getInstance方法提供 例項的情況就是單例模式。 注:單例模式:一個類有且只有一個例項。 1,一個私有的構造器 2,一個私有的該類型別的變數 3,必須有一個共有的返回型別為