当前位置: 技术问答>linux和unix
消息队列的清理问题
来源: 互联网 发布时间:2016-07-17
本文导语: 遇到个问题,各位大侠们帮帮忙啊: 系统中使用SYSTEM V的消息队列,作为两个同源的生产者消费者进程的中介。生产者为单一进程,但产生的消息是按类型划分放入消息队列的,消费者是另一进程的多个线程,...
遇到个问题,各位大侠们帮帮忙啊:
系统中使用SYSTEM V的消息队列,作为两个同源的生产者消费者进程的中介。生产者为单一进程,但产生的消息是按类型划分放入消息队列的,消费者是另一进程的多个线程,不定期取出属于自己类型的消息。现在的问题是,消费者并不能保证一定会来取出属于自己的消息,甚至永远不再出现,这就导致了消息队列可能被某种无法被取出的消息充满的问题。
正常的情况下可以为每个消息打上个时间戳,开启一个清理进程定期对消息队列中的所有消息进行清理,失效的消息就丢弃,有效的重新进入消息队列,但这样就会导致消息顺序的改变,后到的消息反而会先得到处理,请问还有没有更好的办法解决这个问题呢?
系统中使用SYSTEM V的消息队列,作为两个同源的生产者消费者进程的中介。生产者为单一进程,但产生的消息是按类型划分放入消息队列的,消费者是另一进程的多个线程,不定期取出属于自己类型的消息。现在的问题是,消费者并不能保证一定会来取出属于自己的消息,甚至永远不再出现,这就导致了消息队列可能被某种无法被取出的消息充满的问题。
正常的情况下可以为每个消息打上个时间戳,开启一个清理进程定期对消息队列中的所有消息进行清理,失效的消息就丢弃,有效的重新进入消息队列,但这样就会导致消息顺序的改变,后到的消息反而会先得到处理,请问还有没有更好的办法解决这个问题呢?
|
我觉得只有不存在消费者的消息才能被删除,可以从生产者端清理,
当它发现消息队列满了,就调用清除函数清除无效的.
但怎么着,消费者没了要给生产者个信儿啊,以后别生产这类产品了,都没市场了
当它发现消息队列满了,就调用清除函数清除无效的.
但怎么着,消费者没了要给生产者个信儿啊,以后别生产这类产品了,都没市场了
|
而且你要制定一些机制 比如生产方发东西 消费方取到后要给生产方发个ACK 但这样会增加消息队列的负担 自己考虑吧~
|
能不能弄两个消息队列,最开始所有消息都进入第一个队列,然后经过清除处理后,有效的消息再进入第二个消息队列,系统从第二个队列中读消息处理。
|
那能不能当一个消息队列已满,需要清理时,再把有效的消息入到另一个队列里面,然后系统再改从另一个队列里面读消息处理。
|
取出来的数据用消息队列中的结构格式保存成文件,线程正常了再扔进去不就好了 永远不会丢 没必要再开个消息队列 那只会让程序更复杂 那个消息队列万一出问题呢 你在开第三个?
我们维护消息队列都是这么做的
我们维护消息队列都是这么做的