7

我正在写一篇关于从数据库轮询(通过同步存储过程调用)切换到消息队列(通过 pub/sub)的技术文章。我希望能够解释轮询数据库与建立与 AMQP 代理的连接和配置消息处理程序相比有何巨大不同和重得多。

有人可以在这里提供解释,或者指出一个很好的高级教程,说明当通知套接字上有新数据可用时,epoll 如何工作?

4

1 回答 1

8

我假设“epoll 的工作原理”是指从用户的角度来看它是如何工作的(比如,你的代码如何得到通知,以及应该如何处理它),而不是内核的观点(比如, epoll 是如何实现的)。

简短的版本非常简单:就像poll,除了两件事:

  1. 它使用不透明数据结构的句柄,因此您不会在内核边界上来回传递尽可能多的数据。
  2. 它有一些poll没有的选项(特别是边缘触发和一次性通知),可以让您在某些情况下编写更高效的代码。

(还有一个事实是它只适用于 linux。BSD 和相关系统有kqueue,获得一些相同优势的明显不同的方式,Solaris 有/dev/poll,等等,而一些 *nixes 没有等价物。所以如果你想写可移植代码,您要么必须使用poll,要么使用一些更高级别的库,如libevent,或者编写自己的等价物libevent。)

如果您已经了解selectpoll那么维基百科文章及其参考文献中链接的博客文章应该在它们之间告诉您几乎所有您需要知道的内容,并且手册页将填补任何空白。

如果没有,先去了解一下poll,只有这样了解epoll不同之处才有意义。

我仍然不确定这与您的主要问题有何关系。您可以epollinotify数据库文件上,或在消息系统上pipesocket在消息系统的基础上,或几乎任何其他可以表示为 linux 中文件描述符的东西,所以我不确定理解epoll将如何帮助您解释轮询数据库之间的区别与轮询消息队列相比。两者之间当然存在巨大差异,但事件触发机制不是其中之一。

于 2012-12-12T19:24:34.810 回答