ZeroMQ:还在研究为什么epoll比select更好吗?

ZeroMQ作为云计算时代最佳通讯库,以其强大的并发处理能力、适应复杂环境的复杂通讯模式、支持多种通讯方式、高效服务于服务器集群与超级计算、提供异步I/O支持、拥有庞大活跃的开源社区及多语言绑定能力,成为分布式并行计算的理想选择。

还在学socket编程吗?还在研究为什么epoll比select更好吗?

噢,不必了!

在复杂的云计算环境中,我们面临的难题远比这个复杂得多。

庞大的服务器集群作为计算云,对来来看或许只是一个简单的搜索框;而在云的内部,复杂的互联和海量的通讯,加之不稳定的网络环境,廉价服务器的低可用性——构建一个高可用性且具备伸缩能力的云计算的环境,不是那么容易的!

为什么说ZeroMQ是云计算时代最好的通讯库呢?我们从ZeroMQ的特性来分析吧:

1.The socket library that acts as a concurrency framework.

开起来像是并行开发框架的socket库。

为什么一个通讯的库不提供socket的风格,反而看起来像是一个并行的库?

云计算不就是分布式计算嘛!

并行、多核、分布式,让计算能力不断的被扩展扩展,让数据不断地被分区分区,强大的计算能力就是这样堆出来的。

并发是目前云计算这个世界的主题,所以ZMQ提供了一个并发的库,正式我们最最需要的。

如同广告所讲:客户要的不是一英寸的钻头,而是一英寸的洞。

我们要的不是通讯,而是分布式并行计算。


2. Carries messages across inproc, IPC, TCP, and multicast.

提供进程内、进程间、机器间和广播方式的消息通讯。

可以说ZMQ提供了一种强大的复杂环境适应能力。

作为一个通讯库,可能我们觉得进程内通讯和进程间通讯不是重要的。

然而,提供这些功能,使得ZMQ能够在特定的场景下提供特定的解决方案。且通讯的配置相当的简单:inproc://, ipc://, tcp://这三个通讯方案简单地在字符串中指定即可。开发者可以很容易开发出可运维的应用程序,在不同的场景下,可以仅修改配置文件来适应复杂的部署环境。


3.Connect N-to-N via fanout, pubsub, pipeline, request-reply.

在多对多的网络环境中提供多对一,发布/订阅(one-to-many),管道(one-to-one),请求/响应等模型。

模式,还是模式。

(对于fanout这个词,我没完全理解,我觉得在网络通讯中,应该就是多对一这样的场景)

天天做网络的开发的人,可能会觉得通讯就那么三板斧,经典的模式不断在重复,可是我们仍然在具体的问题上反复写着类似的代码。

而ZMQ提供的不仅仅是这个:ZMQ就像一堆水管的转接头,在复杂的自来水供水系统中,ZMQ在每个关节灵活地适配,像水管一样接起来,把数据分开或是合并。

例如,先把数据按照pub/sub模式分发给多个服务器,每个服务器上的进程在进程内用inproc,将请求分布到多个线程上处理,如果有特别的需要,还可以把数据用ipc方式转发给同一机器上的其他进程。而完成这一切复杂的工作仅需要少少的代码。


4. Fast enough for clustered products and supercomputing.

对服务器群集和超级计算来将都足够快了

超级计算都能做,你还想干啥?


5. Asynch I/O for scalable multicore message-passing apps.

对可扩展的多核消息传递应用程序提供异步I/O支持。

在ZMQ的inproc://模式中,库提供了线程安全的消息分发机制,可以简单地把请求分发给多线程处理。


6. Large and active open source community.

拥有超大并且活跃的开源社区

记住,你不是一个人在战斗!不是……


7. 20+ languages including C, C++, Java, .NET, Python.

有超过20种以上的开发语言绑定,诸如C, C++, Java, .NET, Python


8. Most OSes including Linux, Windows, OS X.

还支持绝大多数的操作系统,例如Linux, Windows, OS X


9. LGPL free software with full commercial support.

这是最重要的,不要钱,但也可以提供商业支持。

注:

Fan out:数电里很重要的概念,“一逻辑门的输出需要驱动多个等效门的输入,称输出端接的需要驱动的等效门数为扇出F”。

扇出(fan-out)是定义单个逻辑门能够驱动的数字信号最大输入量的术语。

在 Linux 环境下构建高并发 HTTP 服务时,选择合适的网络库是关键。以下是一些推荐的高性能、适用于高并发场景的网络库: ### libevent libevent 是一个成熟的事件通知库,支持多种 I/O 多路复用机制,包括 epoll(Linux)、kqueue(BSD) select。它提供了高效的事件驱动模型,非常适合处理大量并发连接。 ```c #include <event2/event.h> void callback(evutil_socket_t fd, short event, void *arg) { // 处理事件 } int main() { struct event_base *base = event_base_new(); struct event *ev = event_new(base, -1, EV_READ | EV_PERSIST, callback, NULL); event_add(ev, NULL); event_base_dispatch(base); event_free(ev); event_base_free(base); return 0; } ``` ### libev libev 是另一个高性能的事件循环库,设计上与 libevent 类似,但更加轻量级且性能更优。它同样支持多种后端,如 epoll kqueue。 ### Boost.Asio Boost.Asio 是 C++ 中广泛使用的异步 I/O 库,它基于现代 C++ 特性,提供了高层次的抽象来简化网络编程。Asio 支持同步异步操作,并能够很好地处理高并发场景。 ```cpp #include <boost/asio.hpp> void session(boost::asio::ip::tcp::socket socket) { // 处理会话 } int main() { boost::asio::io_context io; boost::asio::ip::tcp::acceptor acceptor(io, {boost::asio::ip::tcp::v4(), 8080}); while (true) { boost::asio::ip::tcp::socket socket(io); acceptor.accept(socket); std::thread(session, std::move(socket)).detach(); } } ``` ### muduo muduo 是由陈硕开发的一个 C++ 网络库,专为多线程服务器应用而设计。它基于非阻塞 I/O 事件驱动模型,利用了 modern C++ 的特性,适合编写高性能的服务端程序。 ### POCO C++ Libraries POCO 提供了一整套 C++ 类库,其中 Net 模块可以用来构建网络应用程序。虽然它的接口相对较高层次,但在适当配置下也能应对高并发需求。 ### ZeroMQ ZeroMQ 不是一个传统的网络库,但它提供了一种高级的消息传递模式,可以在分布式或并发系统中使用。对于某些特定类型的高并发服务来说,这可能是一个非常合适的选择。 这些网络库各有特点,在实际项目中选择时应考虑团队的技术栈、项目的复杂度以及对性能的具体要求等因素。如果需要进一步的信息或者具体的实现示例,请参考相关文档或官方资源。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值