nanomsg的pub/sub模式用法
2016-04-13 14:40
489 查看
作为一个MQ,pub/sub是非常常见的一个用法,nanomsg作为ZMQ的继任,很少有博客讲述nanomsg的订阅/发布模式。
官方DEMO
我以官方DEMO来说明如何使用订阅发布
说明:
这里推荐的TOPIC 类型是字符串类型。一次订阅只能订阅一个TOPIC。
如果你想订阅两个TOPIC,如"SHANGHAI", "BEIJING",订阅两次。
content是你想发布的内容。
length(content)是发布的内容的长度
如发布上海的天气
上面发布的内容接收方接收的数据的形式?
只有订阅了
SHANGHAI***的订阅方才能受到数据,我没阅读源码,估计发布的内容会遍历订阅的话题,通配开头内容相匹配的话题。---这样的做法性能应该是不会很高的,但是可以适应多种订阅业务的数据类型。
我感觉以字符串做TOPIC,构建显式的发布接口,以如下形式提供更合理
接收方以实现。
这样的方式可以用HASHMAP来管理TOPIC。
如果需要这样强类型的主题,可以考虑ZMQ,需要注意的是,ZMQ的FILTER是在SUB端处理的,意味着所有的MSG都会推给所有的Suber方(非常欠缺),或者有空可以考虑自己实现一个。
参考链接
http://nanomsg.org/v0.5/nn_pubsub.7.html
http://tim.dysinger.net/posts/2013-09-16-getting-started-with-nanomsg.html
https://github.com/nanomsg/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方(非常欠缺),或者有空可以考虑自己实现一个。
参考链接
http://nanomsg.org/v0.5/nn_pubsub.7.html
http://tim.dysinger.net/posts/2013-09-16-getting-started-with-nanomsg.html
https://github.com/nanomsg/nanomsg
相关文章推荐
- Java 版的 Ruby 解释器 JRuby 1.7.14 发布
- Fedora Linux 7 Test 4 发布 下载地址
- 使用npm发布Node.JS程序包教程
- 微软NET Framework 3.5 Beta 1 发布 提供下载
- 可简单避免的三个JS发布错误的详细介绍
- ASP.NE网站发布注意事项简析
- 批处理备份文件夹和文件后发布文件夹至网站
- 怎么发布打包并发布自己的Android应用(APP)
- PHP实现简单的新闻发布系统实例
- PHP 7.0.2 正式版发布
- JavaScript中发布/订阅模式的简单实例
- Python代码的打包与发布详解
- 有关Jfinal在jetty环境下开发,tomcat环境下发布造成的问题解决心得。
- Apache Spark 1.5.0正式发布
- ios 发布企业级应用部署解决方案
- 修改博客rss订阅不更新错误,同时征集订阅方式
- 发布中文Qt程序时要注意的问题
- Qt 程序在 windows 下的发布
- 索尼发布PlayStation 4
- Rancher 1.4发布:k8s体验的大迈进