2016-12-05 1 views
0

Ich arbeite mit Amazon SQS-Warteschlangen, und ich möchte zwei Warteschlangen haben, sagen wir eine mit hoher Priorität Aufgaben und andere mit niedriger Priorität Aufgaben.priorität selektor mit java nio?

Ich möchte ein Setup erstellen, bei dem meine App immer zuerst alle Aufgaben mit hoher Priorität verbraucht, bevor sie mit den niedrigen Prioritäten beginnt (Verhungern ist in meinem Fall kein Problem).

Meine erste Idee war, zwei Cosumers zu haben, einen für jede Warteschlange, die Nachrichten von jeder Warteschlange zu bekommen und sie in eine java.util.PriorityQueue zu setzen, aber ich wollte das Einfügen vermeiden (und sortieren/blockieren/synchronisieren) Kosten, weil es eine große Menge an Nachrichten gibt.

Dann dachte ich an usign java.nio, aber ich konnte nicht herausfinden, ob das möglich ist.

Meine Idee war, immer noch die zwei Verbraucher zu haben, aber jetzt legen sie ihre Aufgaben in zwei nio.buffers (hoher Prioritätspuffer, niedriger Prioritätspuffer), diese Puffer sind an nio.channels gebunden (hoher p. Kanal, niedrig p. channel), und dann sollte ein Selektor, wenn möglich, zuerst von einem Kanal mit hoher Priorität zuerst verbrauchen, bevor er von Kanal mit niedriger Priorität verbraucht wird.

Ich habe keine Möglichkeit gefunden, diese Auswahlreihenfolge zu konfigurieren. Ist das möglich?

Eine andere Alternative?

danke im voraus.

Antwort

0

Amazon SQS bieten eine Funktion zum Abfragen ungelesener Nachrichtengröße.

Wenn Sie Nachricht abrufen möchten, abfragen ungelesene Nachrichtengröße von hoher Priorität SQS, wenn die Größe> 0, Nachricht von hoher Priorität erhalten, sonst erhalten Sie Nachricht von niedriger Priorität sqs.

AWSQSClient.getQueueUnreadSize(String queue_name); 

Wie ist das?

+0

hum ... dies würde eine weitere Anfrage an SQS in meiner Schleife hinzufügen (jetzt gibt es zwei: fetch Nachricht und ack/delete Nachricht), jedes kostet etwa 20ms Zeit. in diesem Moment denke ich, die bessere Lösung wäre einfach entfernen die lange Umfrage (auf 0 ms gesetzt), und die beiden Warteschlangen. Wenn der Thread etwas in der Prioritätswarteschlange findet, fertig, verarbeite die Nachricht. Wenn nicht, versuchen Sie, eine Nachricht von der Warteschlange mit niedriger Priorität zu erhalten, und wiederholen Sie die Schleife. – weeanon