Muduo 网络编程示例之九:简单的消息广播服务

简介:

Muduo 网络编程示例之九:简单的消息广播服务

陈硕 (giantchen_AT_gmail)

Blog.csdn.net/Solstice  t.sina.com.cn/giantchen

这是《Muduo 网络编程示例》系列的第九篇文章,讲用 muduo 实现一个简单的 pub/sub 服务

Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx

本文介绍用 muduo 实现一个简单的 topic-based 消息广播服务,这其实是“聊天室”的一个简单扩展,不过聊天的不是人,而是分布式系统中的程序。

本文的代码见 http://code.google.com/p/muduo/source/browse/trunk/examples/hub

在分布式系统中,除了常用的 end-to-end 通信,还有一对多的广播通信。一提到“广播”,或许会让人联想到 IP 多播或 IP 组播,这不是本文的主题。本文将要谈的是基于 TCP 协议的应用层广播。示意图如下:

hub

上图中圆角矩形代表程序,"Hub"是一个服务程序,不是网络集线器,它起到类似集线器的作用,故而得名。Publisher 和 Subscriper 通过 TCP 协议与 Hub 程序通信。Publisher 把消息发到某个 topic 上,Subscribers 订阅该 topic,然后就能收到消息。即 publisher 借助 hub 把消息广播给了多个 subscribers。这种 pub/sub 结构的好处在于可以增加多个 Subscriber 而不用修改 Publisher,一定程度上实现了“解耦”(也可以看成分布式的 observer pattern)。 由于走的是 TCP 协议,广播是基本可靠的,这里的“可靠”指的是“比 UDP 可靠”,不是“完全可靠”。(思考:如何避免 Hub 成为 single point of failure?)

为了避免串扰(cross-talk),每个 topic 在同一时间只应该有一个 publisher,hub 不提供 compare-and-swap 操作。

(“可靠广播、原子广播”在分布式系统中有重大意义,是以 replicated state machine 方式实现可靠的分布式服务的基础,“可靠广播”涉及 consensus 算法,超出了本文的范围。)

应用层广播在分布式系统中用处很大,这里略举几例:

1. 体育比分转播。有 8 片比赛场地正在进行羽毛球比赛,每个场地的计分程序把当前比分发送到各自的 topic 上(第 1 号场地发送到 court1,第 2 号发送到 court2,以此类推)。需要用到比分的程序(赛场的大屏幕显示,网上比分转播等等)自己订阅感兴趣的 topic ,就能及时收到最新比分数据。由于本文实现的不是 100% 可靠广播,那么消息应该是 snapshot,而不是 incremental。(换句话说,消息的内容是“现在是几比几”,而不是“刚才谁得分”。)

2. 负载监控。每台机器上运行一个监控程序,周期性地把本机当前负载(CPU、网络、磁盘、温度)publish 到以 hostname 命名的 topic 上,这样需要用到这些数据的程序只要在 hub 订阅相应的 topic 就能获得数据,无需与多台机器直接打交道。(为了可靠起见,监控程序发送的消息里边应该包含时间戳,这样能防止 stale 数据,甚至一定程度上起到心跳的作用。)沿着这个思路,分布式系统中的服务程序也可以把自己的当前负载发布到 hub 上,供 load balancer 和 monitor 取用。

协议

为了简单起见,muduo 的 hub 示例采用以 '\r\n' 分界的文本协议,这样用 telnet 就能测试 hub。协议只有三个命令:

  • sub <topic>\r\n
    • 该命令表示订阅 <topic>,以后该 topic 有任何跟新都会发给这个 tcp 连接。在 sub 的时候,hub 会把该 <topic> 上最近的消息发给此 subscriber。
  • unsub <topic>\r\n
    • 该命令表示退订 <topic>
  • pub <topic>\r\n<content>\r\n
    • 往 <topic> 发送消息,内容为 <content>。所有订阅了此 <topic> 的 subscribers 会收到同样的消息“pub <topic>\r\n<content>\r\n”

代码

muduo 示例中的 hub 分为几个部分:

一个程序可以既是 publisher 又是 subscriber,而且 pubsub 库只用一个 tcp 连接(这样 failover 比较简便)。

使用范例:

  1. 开启 4 个命令行窗口
  2. 在第一个窗口运行 $ hub 9999
  3. 在第二个窗口运行 $ sub 127.0.0.1:9999 mytopic
  4. 在第三个窗口运行 $ sub 127.0.0.1:9999 mytopic court
  5. 在第四个窗口运行 $ pub 127.0.0.1:9999 mytopic "Hello world."  ,这时第二三号窗口都会打印 “mytopic: Hello world.”,表明收到了 mytopic 这个主题上的消息。
  6. 在第四个窗口运行 $ pub 127.0.0.1:9999 court "13:11"  ,这时第三号窗口会打印 “court: 13:11”,表明收到了 court 这个主题上的消息。第二号窗口没有订阅此消息,故无输出。

借助这个简单的 pub/sub 机制,还可以做很多有意思的事情。比如把分布式系统中的程序的一部分 end-to-end 通信改为通过 pub/sub 来做(例如,原来是 A 向 B 发一个 SOAP request,B 通过同一个 tcp 连接发回 response (分析二者的通信只能通过查看 log 或用 tcpdump 截获);现在是 A 往 topic_a_to_b 上发布 request,B 在 topic_b_to_a 上发 response),这样多挂一个 monitoring subscriber 就能轻易地查看通信双方的沟通情况,很容易做状态监控与 trouble shooting。


    本文转自 陈硕  博客园博客,原文链接:http://www.cnblogs.com/Solstice/archive/2011/05/25/2057515.html,如需转载请自行联系原作者







相关文章
|
2月前
|
存储 安全 网络安全
云端防御策略:融合云服务与网络安全的未来之路
在数字化浪潮的推动下,企业纷纷转向云计算以获取灵活性、可扩展性和成本效益。然而,随之而来的是日益复杂的网络威胁,它们挑战着传统的安全边界。本文将探讨如何通过创新的云服务模型和先进的网络安全措施来构建一个既可靠又灵活的安全框架。我们将分析云计算环境中的关键安全挑战,并提出一系列针对性的策略来加强数据保护,确保业务连续性,并满足合规要求。
|
2天前
|
安全 算法 网络协议
LabVIEW网络服务安全2
LabVIEW网络服务安全2
|
2天前
|
安全 算法 API
LabVIEW网络服务安全
LabVIEW网络服务安全
|
2天前
|
安全 物联网 网络安全
云端之盾:融合云服务与网络安全的未来之路
【5月更文挑战第10天】 在数字化的浪潮中,云计算以其灵活性、可扩展性和成本效益成为企业转型的重要驱动力。然而,随着云服务的广泛采纳,网络安全和信息保护的挑战也随之增加。本文深入探讨了云计算环境中的安全威胁,分析了当前的安全措施,并提出了面向未来的综合安全策略。我们将重点讨论如何通过技术创新、政策制定和行业合作来强化云服务的安全性,确保信息资产的完整性、可用性和保密性得到全面保障。
|
5天前
|
数据安全/隐私保护 网络协议 网络安全
2024年广东省网络系统管理样题第4套服务部署部分
2024年广东省网络系统管理样题第4套服务部署部分
2024年广东省网络系统管理样题第4套服务部署部分
|
5天前
|
数据安全/隐私保护 网络安全 网络协议
2024年广东省网络系统管理样题第5套服务部署部分
2024年广东省网络系统管理样题第5套服务部署部分
2024年广东省网络系统管理样题第5套服务部署部分
|
5天前
|
网络协议 网络安全 域名解析
2024年广东省网络系统管理样题第1套服务部署部分
2024年广东省网络系统管理样题第1套服务部署部分
2024年广东省网络系统管理样题第1套服务部署部分
|
9天前
|
人工智能 安全 网络安全
云端防线:融合云服务与网络安全的未来策略
【5月更文挑战第3天】 在数字化时代,云计算为企业提供了弹性、可扩展的资源解决方案,同时引入了全新的安全挑战。本文深入探讨了云服务模型中的安全威胁和防御机制,分析了信息安全管理的关键要素,并提出了一套综合的网络安全策略。通过采用先进的加密技术、身份认证、入侵检测系统以及行为分析,构建了一个多层次的安全框架来保障数据和服务的完整性、可用性与机密性。文中还讨论了合规性和监管问题,以及如何通过持续的安全评估和风险评估来强化安全防护。最后,文章指出了未来云安全研究的方向,强调了人工智能与机器学习在提升云服务安全性中的作用。
|
12天前
|
安全 网络安全 Android开发
云端防御策略:融合云服务与网络安全的未来构建高效的Android应用:从内存优化到电池寿命
【4月更文挑战第30天】 随着企业加速向云计算环境转移,数据和服务的云端托管成为常态。本文探讨了在动态且复杂的云服务场景下,如何构建和实施有效的网络安全措施来保障信息资产的安全。我们将分析云计算中存在的安全挑战,并展示通过多层次、多维度的安全框架来提升整体防护能力的方法。重点关注包括数据加密、身份认证、访问控制以及威胁检测与响应等关键技术的实践应用,旨在为读者提供一种结合最新技术进展的网络安全策略视角。 【4月更文挑战第30天】 在竞争激烈的移动市场中,Android应用的性能和资源管理已成为区分优秀与平庸的关键因素。本文深入探讨了提升Android应用效率的多个方面,包括内存优化策略、电池
|
12天前
|
负载均衡 网络协议 应用服务中间件
【亮剑】在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。
【4月更文挑战第30天】本文介绍了在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。HAProxy是一个高性能的开源TCP和HTTP负载均衡器,适合处理大量并发连接;Nginx是一个多功能Web服务器和反向代理,支持HTTP、HTTPS和TCP负载均衡,同时提供缓存和SSL功能;Keepalived用于监控和故障切换,通过VRRP实现IP热备份,保证服务连续性。文中详细阐述了如何配置这三个工具实现负载均衡,包括安装、配置文件修改和启动服务,为构建可靠的负载均衡系统提供了指导。