2

複数のプロデューサーが 1 つのコンシューマーにメッセージを送信する、プロデューサーとコンシューマーの問題の例を考えてみます。一部のメッセージが「同時に」コンシューマーに到着したときに、プロデューサーの枯渇を回避するためにどのような手法をお勧めしますか? 今まで私は考えています:

  1. いくつかの確率分布をサンプリングすることにより、「非決定論的」を選択します(異なるタイムスタンプで異なる数のメッセージが到着することを考えると、方法はわかりません)。
  2. いくつかのカウンターを使用して、n 個のメッセージを送信した後、プロデューサーをしばらくスリープ状態にします。
4

2 に答える 2

1

プライオリティ キューを持つことができれば、各プロデューサーはメッセージ送信カウンターを持つことができると思います。また、キューは 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++));
   }
}

したがって、Producer 1 が (最初に) 5 つの要素をキューに追加し、Producer 2 が 1 を追加すると、キューは次のようになります。

P1: 5
P1: 4
P1: 3
P1: 2
P2: 1
P1: 1
于 2013-03-29T18:36:05.690 に答える
0

最も単純で最良の方法の 1 つは、メッセージを到着順に処理することです (単純な FIFO リストでうまくいきます)。複数のメッセージが同時に来ても問題ありません。このようにして、どの生産者も飢えることはありません。

私が確認したいことの 1 つは、コンシューマーがメッセージを生成するプロデューサーよりも速くメッセージを消費することです。そうしないと、プロデューサーがコンシューマーを待機することになり、単一のコンシューマーに対して複数のプロデューサーを使用しても何の利点もありません。

于 2013-03-29T18:17:40.740 に答える