Ich suche ein Verständnis von ServiceStack.Redis: IRedisClient.PublishMessage vs. IMessageQueueClient.Publish
Es fällt mir schwer, das und zu trennen IRedisClient.PublishMessage, IMessageQueueClient.Publishund ich merke, dass ich etwas verwechseln muss.
ServiceStack gibt uns die Möglichkeit, auf Pub/Sub-Broadcasts wie folgt zu hören:
static IRedisSubscription _subscription;
static IRedisClient redisClientSub;
static int received = 0;
static void ReadFromQueue()
{
redisClientSub = redisClientManager.GetClient();
_subscription = redisClientSub.CreateSubscription();
_subscription.OnMessage = (channel, msg) =>
{
try
{
received++;
}
catch (Exception ex)
{
}
};
Task.Run(() => _subscription.SubscribeToChannels("Test"));
}
Sieht gut aus, unkompliziert. Aber was ist mit dem Produzenten?
Als ich mir die verfügbaren Klassen ansah, dachte ich, dass man entweder die IRedisClient.PublishMessage(string toChannel, string message)oder verwenden könnte IMessageQueueClient.Publish(string queueName, IMessage message).
redisClient.PublishMessage("Test", json);
// or:
myMessageQueueClient.Publish("Test", new Message<CoreEvent>(testReq));
In beiden Fällen geben Sie den Kanalnamen selbst an. Dies ist das Verhalten, das ich sehe:
- der obige Abonnent bekommt die Nachricht nur wenn ich nutze
IRedisClient.PublishMessage(string toChannel, string message)und nie wenn ich nutzeIMessageQueueClient.Publish(string queueName, IMessage message) - Wenn ich mit veröffentliche
IRedisClient.PublishMessage, habe ich erwartet, dass der „Test“-Kanal gefüllt wird (wenn ich ihn mit einem Redis-Browser ansehe), aber das ist nicht der Fall. Ich sehe nie eine Spur der Warteschlange (sagen wir, ich starte das Abonnement nicht, aber die Produzenten fügen Nachrichten hinzu) - Wenn ich mit veröffentliche
IMessageQueueClient.Publish(string queueName, IMessage message), wird der Kanal „Test“ erstellt und die Nachrichten werden dort beibehalten, aber nie per Popup/Fetch-and-delete gelöscht.
Ich möchte den Unterschied zwischen den beiden verstehen. Ich habe mir den Quellcode angesehen und alles gelesen, was ich darüber lesen kann, aber ich habe keine Dokumentation dazu gefunden IRedisClient.PublishMessage.
Antworten
Mythz hat dies hier im ServiceStack-Forum beantwortet .
Er schreibt:
Diese Clients sollten nicht austauschbar verwendet werden, Sie sollten nur ServiceStack MQ-Clients verwenden, um MQ-Nachrichten oder den Message MQ-Nachrichtenwrapper zu senden.
Das Redis-Abonnement ist eine Low-Level-API zum Erstellen eines Redis Pub/Sub-Abonnements. Eine nützlichere API auf höherer Ebene ist der verwaltete Pub/Sub-Server, der das Pub/Sub-Abonnement hinter einem verwalteten Thread umschließt.
Wie auch immer, MQ Server ist nur dafür ausgelegt, Nachrichten von MQ-Clients zu verarbeiten. Wenn Sie Ihre eigene Messaging-Implementierung implementieren, verwenden Sie Ihre eigenen Nachrichten- und Redis-Clients, nicht die MQ-Clients oder die MQ-Nachrichtenklasse.
und
Keine IRedisClient (& ServiceStack.Redis) APIs sind für Redis Server, die PublishMessage API sendet den redis PUBLISH Befehl. IRedisSubscription erstellt ein Redis Pub/Sub-Abonnement, siehe Redis-Dokumentation, um zu erfahren, wie Redis Pub/Sub funktioniert. Die ServiceStack.Redis-Bibliothek und alle ihre APIs sind nur für Redis Server, sie enthalten keine ServiceStack.Messaging-MQ-APIs.
Verwenden Sie also einfach ServiceStack.Redis für Ihre benutzerdefinierte Redis Pub/Sub-Abonnementimplementierung, dh verwenden Sie keine ServiceStack.Messaging-APIs, die nur für ServiceStack MQ vorgesehen sind.