RabbitMQ: schnell Produzent und Verbraucher langsam

Ich habe eine Anwendung, die verwendet RabbitMQ als message-queue zum senden/empfangen von Nachrichten zwischen zwei Komponenten: sender und Empfänger. Der sender sendet Nachricht in eine sehr schnelle Art und Weise. Der Empfänger erhält die Nachricht und macht dann einige sehr zeitaufwändige Aufgabe (vor allem Datenbank schreiben für sehr große Daten-Größe). Da der Empfänger nimmt eine sehr lange Zeit, um die Aufgabe abzuschließen und dann rufen Sie die nächste Nachricht in der Warteschlange, der sender, halten, füllt sich die Warteschlange schnell. Also meine Frage ist: Wird diese Ursache der message-queue-überlauf?

Den message consumer sieht wie folgt aus:

public void onMessage() throws IOException, InterruptedException {
    channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
    String queueName = channel.queueDeclare("allDataCase", true, false, false, null).getQueue();
    channel.queueBind(queueName, EXCHANGE_NAME, "");

    QueueingConsumer consumer = new QueueingConsumer(channel);
    channel.basicConsume(queueName, true, consumer);

    while (true) {
        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        String message = new String(delivery.getBody());
        System.out.println(" [x] Received '" + message + "'");

        JSONObject json = new JSONObject(message);
        String caseID = json.getString("caseID");
        //following takes very long time            
        dao.saveToDB(caseID);
    }
}

Jede empfangene Nachricht durch den Verbraucher enthält eine caseID. Für jede caseID, es wird speichern große Menge von Daten in der Datenbank, das dauert sehr lange Zeit. Derzeit wird nur ein Verbraucher für die RabbitMQ seit dem producer/consumer-verwenden Sie die gleiche Warteschlange für die publish/subscribe-der caseID. Also, wie kann ich die Geschwindigkeit des consumer-Durchsatz, so dass die Verbraucher können aufholen mit dem Produzenten und vermeiden Sie die Meldung überlauf der Warteschlange? Sollte ich das multithreading in den consumer-Teil, um die Geschwindigkeit der Verbrauch? Oder sollte ich mehrere Verbraucher zu konsumieren, die eingehende Nachricht simutaneously? Oder ist es so asynchron zu lassen, die Verbraucher konsumieren die Nachricht asynchron, ohne zu warten, es zu beenden? Alle Vorschläge sind willkommen.

InformationsquelleAutor der Frage tonga | 2014-10-28

Schreibe einen Kommentar