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,必須有一個共有的返回型別為