zeromq怎么一个端口发送多个主题

简介: 我们这里使用czmq4 版本处理。在CZMQ的版本4中,在一个端口上发布多个订阅主题。这是通过使用PUB/SUB模式实现的。在这种模式下,一个或多个发布者将消息发布到一个或多个主题,然后一个或多个订阅者可以订阅一个或多个主题来接收消息。

我们这里使用czmq4 版本处理。

在CZMQ的版本4中,在一个端口上发布多个订阅主题。这是通过使用PUB/SUB模式实现的。在这种模式下,一个或多个发布者将消息发布到一个或多个主题,然后一个或多个订阅者可以订阅一个或多个主题来接收消息。


在发布者端,你可以通过将主题作为消息的一部分来发布到特定的主题。例如,如果你有两个主题"TopicA"和"TopicB",你可以这样发布消息:

zsock_t *publisher = zsock_new(ZMQ_PUB);
zsock_bind(publisher, "tcp://*:12345");
zmsg_t *msg = zmsg_new();
zmsg_addstr(msg, "TopicA");
zmsg_addstr(msg, "Some message for topic A");
zmsg_send(&msg, publisher);
msg = zmsg_new();
zmsg_addstr(msg, "TopicB");
zmsg_addstr(msg, "Some message for topic B");
zmsg_send(&msg, publisher);


在订阅者端,你可以订阅一个或多个主题,只接收这些主题的消息。例如,如果你只对"TopicA"感兴趣,你可以这样订阅:


zsock_t *subscriber = zsock_new(ZMQ_SUB);
zsock_connect(subscriber, "tcp://localhost:12345");
zsock_set_subscribe(subscriber, "TopicA");


如果你对所有主题都感兴趣,你可以不指定主题,订阅所有消息:


zsock_set_subscribe(subscriber, "");


这样,你就可以在一个端口上发布多个主题,让订阅者根据自己的需求订阅感兴趣的主题。


CZMQ库中,在一个端口上发布多个主题

是的,在CZMQ库中,你可以在一个端口上发布多个主题。这是通过ZMQ的发布/订阅模式实现的。


在发布/订阅模式中,一个或多个发布者将消息发送到一个或多个主题,然后一个或多个订阅者可以订阅一个或多个主题来接收相关的消息。


在CZMQ中,你可以使用zsock_new_pub函数创建一个发布者套接字,然后使用zstr_send函数发送消息。在发送消息时,你可以在消息的开始部分包含一个主题字符串,然后订阅者可以使用这个主题来过滤他们感兴趣的消息。


例如,以下是一个发布者发送两个不同主题的消息的示例:

zsock_t *publisher = zsock_new_pub("tcp://*:5556");
zstr_send(publisher, "topic1 message1");
zstr_send(publisher, "topic2 message2");


在这个例子中,"topic1"和"topic2"是主题,“message1"和"message2"是消息。订阅者可以选择订阅"topic1”,“topic2”,或者两者都订阅。


请注意,主题是消息的一部分,而不是端口或套接字的一部分。这意味着你可以在同一个发布者套接字上发布任意数量的主题。


增加安全性

当然这样获取所有内容的订阅方式如此的简单,我们当然不期望它能随意获取不想给它的主题,这就引出一个问题:我希望除非订阅方知道主题名称,否则他不能够通过 * 得到消息内容。


在ZeroMQ中,如果你希望只有知道主题的订阅者才能接收到消息,你可以考虑使用CURVE安全机制。CURVE是一个加密机制,它可以确保只有拥有正确密钥的订阅者才能接收和解密消息。


首先,你需要为每个主题生成一对公钥和私钥。然后,将公钥提供给任何希望订阅该主题的订阅者。订阅者使用公钥来接收和解密消息。


在发布者端,你需要使用私钥来加密消息。这样,只有拥有对应公钥的订阅者才能解密和接收消息。


以下是使用CZMQ的CURVE安全机制的示例:


// 创建和配置安全套接字
zcert_t *cert = zcert_new();
zsock_t *publisher = zsock_new(ZMQ_PUB);
zsock_set_curve_server(publisher, 1);
zsock_set_curve_secretkey(publisher, zcert_secret_txt(cert));
// 绑定和发送消息
zsock_bind(publisher, "tcp://*:12345");
zstr_send(publisher, "Hello");
// 创建和配置订阅者套接字
zsock_t *subscriber = zsock_new(ZMQ_SUB);
zsock_set_curve_serverkey(subscriber, zcert_public_txt(cert));
zsock_set_curve_publickey(subscriber, zcert_public_txt(cert));
zsock_set_curve_secretkey(subscriber, zcert_secret_txt(cert));
// 连接和接收消息
zsock_connect(subscriber, "tcp://localhost:12345");
char *msg = zstr_recv(subscriber);


这样,只有知道主题公钥的订阅者才能接收到消息。


上述代码中,我们使用了ZeroMQ的CURVE安全机制来实现消息的加密和解密。CURVE是基于Elliptic Curve Cryptography的安全机制,它可以确保只有拥有正确密钥的订阅者才能接收和解密消息。


在这个例子中,我们首先创建了一个新的证书zcert_t *cert = zcert_new();。这个证书包含了一对公钥和私钥。然后,我们创建了一个新的发布者套接字,并设置它为CURVE服务器,并设置其私钥为刚刚生成的证书的私钥。


接下来,我们创建了一个新的订阅者套接字,并设置了它的服务器公钥、公钥和私钥。这样,订阅者就可以使用这个公钥来接收和解密消息了。


至于订阅者如何得到主题公钥,这通常需要通过安全的方式进行分发。例如,你可以通过安全的邮件、安全的文件传输或者安全的API来将公钥发送给订阅者。在这个例子中,我们假设订阅者已经以某种方式得到了公钥。


需要注意的是,这个例子只是一个简单的示例,实际使用时可能需要更复杂的逻辑来处理密钥的生成、存储和分发。同时,你也需要确保你的系统的其他部分(如网络、操作系统等)也是安全的,以防止密钥被窃取。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

目录
相关文章
|
7月前
|
消息中间件 网络协议
RabbitMQ消息的应答
RabbitMQ消息的应答
62 0
|
2月前
Erlang在端口上接收消息
Erlang在端口上接收消息
36 1
|
4月前
|
消息中间件
RabbitMQ广播模式
RabbitMQ广播模式
83 1
|
5月前
|
消息中间件 RocketMQ
消息队列 MQ使用问题之如何使用SockJS和Stomp与RabbitMQ建立连接
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
消息中间件
消息中间件系列教程(16) -RabbitMQ-应答模式
消息中间件系列教程(16) -RabbitMQ-应答模式
74 0
|
消息中间件
RabbitMQ如何支持事务性消息的发送和接收
RabbitMQ消息的发送和接收
229 0
|
消息中间件 Java
RabbitMQ发送方确认机制
RabbitMQ发送方确认机制
118 0
|
消息中间件 网络协议
RabbitMQ学习(四):消息应答
为了保证消息在发送过程中不丢失,rabbitmq 引入消息应答机制,消息应答就是:消费者在接 收到消息并且处理该消息之后,告诉 rabbitmq 它已经处理了,rabbitmq 可以把该消息删除了。
200 0
RabbitMQ学习(四):消息应答
|
消息中间件 缓存 JSON
RabbitMq数据发送监听
RabbitMq数据发送监听
|
消息中间件 网络协议
RabbitMQ消息应答
消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况。RabbitMQ一旦向消费者传递了一条消息,便立即将该消息标记为删除。
RabbitMQ消息应答