RabbitMQ und C#
Mit RabbitMQ gibt es einen Weg, es zu benutzen, ähnlich MSSMQ wo kann man pop 1000 Nachrichten aus der Warteschlange, dann machen Sie Ihre Einsätze, um die Datenbank und von dort aus weiter.
Ich kann nicht scheinen zu tun, dass mit einem Abonnement für einen Kanal und dann ein foreach über die BasicDeliveryEventArgs im Abonnement, mit, dass dabei eine If-Anweisung mit der max Anzahl Nachrichten, die ich Bearbeiten möchten, in der gegebenen Zeit.
Vielen Dank im Voraus
Dies ist jedoch immer noch nimmt alle 22k Nachrichten aus der Warteschlange
using (IConnection connection = factory.CreateConnection())
{
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare("****", true, false, false, null);
var subscription = new Subscription(channel, "****", false);
int maxMessages = 5;
int i = 0;
foreach (BasicDeliverEventArgs eventArgs in subscription)
{
if (++i == maxMessages)
{
Console.WriteLine("Took 5 messages");
subscription.Ack(eventArgs);
break;
}
}
}
}
- Ich verstehe nicht, die Frage, insbesondere die "mit, dass dabei eine if-Anweisung" Teil. Sie könnten versuchen zu klären?
- Aktualisiert die post
- Immer noch nicht die für mich Sinn machen. Was versuchen Sie zu erreichen?
- Ich werde versuchen, 1000 Nachrichten aus der Warteschlange zu einem Zeitpunkt, und nicht alle haben die Nachricht, die unten kommen auf einmal
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie wollen zu optimieren das laden von Nachrichten in der Datenbank von Dosierungs-Gruppen in größeren Transaktionen eher als das tragen der Kosten einer Transaktion pro Nachricht. Mit der obligatorischen Warnung, dass große Gruppen von Nachrichten kann fehlschlagen, gemeinsam, wenn auch nur einer von Ihnen führt zu einem problem, hier ist, wie würden Sie gehen über es...
Set QOS auf dem Kanal:
Diese pre-fetch 1000 Meldungen und weiteren Verkehr blockieren, bis Sie ACK etwas. Beachten Sie, dass es doesn ' T fetch in Blöcke von 1000. Vielmehr stellt sicher, dass maximal 1000 UNACK ' ed Nachrichten sind pre-fetched zu jeder Zeit. Simulation von block-transfers ist so einfach wie die Verarbeitung der 1000 Nachrichten zuerst, und dann ACK ' Ing Sie alle in einem gehen.
Sehen hier und hier für eine maßgebliche Erklärung als meine.
Einen Punkt mehr: Sie können bündig in die queue, sobald Nachrichten vorliegen, auch wenn Sie noch nicht aus Ihrem Kontingent von 1000 Nachrichten. Sie sollten in der Lage sein, dies zu tun, durch aufrufen
queue.BasicGet()
innerhalb derforeach
- Schleife, bis es läuft trocken, und dann liefern Sie, was Sie haben (einschließlich der Nachricht, die Sie zog aussubscription
) in der Datenbank. Caveat: ich habe nicht versucht, diese selbst, und so konnte ich reden Müll, aber ich denke, es wird funktionieren. Die Schönheit dieser Methode ist, schiebt er die Nachrichten in die Datenbank sofort, ohne zu warten, für eine volle charge von 1000 Nachrichten. Wenn die Datenbank fällt hinten von der Handhabung zu viele kleine Transaktionen, die prefetch-backlog wird einfach füllen mehr zwischen jedem Zyklus.