给定一个生产者-消费者问题的实例,其中多个生产者向单个消费者发送消息:当一些消息“同时”到达消费者时,您建议使用哪些技术来避免生产者饥饿。到目前为止,我正在考虑:
- 通过采样一些概率分布来选择“非确定性”(不确定如何,考虑到不同数量的消息到达不同的时间戳)。
- 在发送 n 条消息后,使用一些计数器并让生产者休眠一段时间。
给定一个生产者-消费者问题的实例,其中多个生产者向单个消费者发送消息:当一些消息“同时”到达消费者时,您建议使用哪些技术来避免生产者饥饿。到目前为止,我正在考虑:
如果你可以有一个优先队列,我认为每个生产者都可以有一个消息发送计数器。并且队列将根据 messageSent 编号和日期进行排序,这样如果一条消息的发送数量小于另一条消息,则一条消息应该在另一条消息之前发送。
在 Java 中
class Message { //or you can implement Comparable<Message>
final Date created = new Date();
final int messageNumber;
public Message(int m ){this.messageNumber = m;}
}
BlockingQueue<Message> queue = new PriorityBlockingQueue<Message>(new Comparator(){
public int compare(Message m1, Message m2){
if(m1.messageNumber < m2.messageNumber) return 1;
if(m2.messageNumber < m1.messageNumber) return -1;
if(m1.messageNumber == m2.messageNumber) return m1.created.compareTo(m2.created);
}
});
class Provider{
int currentMessage = 0;
void send(){
queue.offer(new Message(currentMessage++));
}
}
因此,如果生产者 1 向队列中添加 5 个元素(第一个),生产者 2 向队列中添加 1,则队列将有
P1: 5
P1: 4
P1: 3
P1: 2
P2: 1
P1: 1
最简单和最好的方法之一是按照消息到达的顺序处理消息(一个简单的 FIFO 列表就可以了)。即使多条消息同时出现也没关系。通过这种方式,没有一个生产者会挨饿。
我要确保的一件事是消费者比生产者消费消息的速度更快。如果不是这样,它可能最终导致生产者等待消费者,并且为单个消费者拥有多个生产者不会有任何优势。