你的位置:首页 > 操作系统

[操作系统]关于消息队列


  消息队列就是一个消息的链表。

  可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。

  消息队列的类型:

  POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用。考虑到程序的可移植性,新开发的应用程序应尽量使用POSIX消息队列。

系统V消息队列是随内核持续的,只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被删除。因此系统中记录消息队列的数据结构(struct ipc_ids msg_ids)位

于内核中,系统中的所有消息队列都可以在结构msg_ids中找到访问入口。每个消息队列都有一个队列头,用结构struct msg_queue来描述。队列头中包含了该消息队列的大量

信息,包括消息队列键值、用户ID、组ID、消息队列中消息数目等等,甚至记录了最近对消息队列读写进程的ID。读者可以访问这些信息,也可以设置其中的某些信息。

  消息队列的主要作用:

  1. 解耦

  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

  2. 冗余

  消息队列把数据进行持久化直到它们已经被完全处理,避免了数据丢失的风险。在被许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理过程明确的指出该消息已经被处理完毕,确保你的数据被安全的保存直到你使用完毕。

  3. 扩展性

  因为消息队列解耦了处理过程,所以增大消息入队和处理的频率是很容易的;只要另外增加处理过程即可。

  4. 峰值处理能力

    使用消息队列能够使关键组件顶住增长的访问压力,不会因为超出负荷的请求而完全崩溃。

  5. 可恢复性

  当体系的一部分组件失效,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

  6. 异步通信

  当不需要立即处理消息时。消息队列提供了异步处理机制,允许把一个消息放入队列,但并不立即处理它。

  看到了一篇文章,谈消息队列的缺点,写的也不错。http://kb.cnblogs.com/page/212710/