В поисках понимания ServiceStack.Redis: IRedisClient.PublishMessage vs IMessageQueueClient.Publish

Aug 17 2020

Мне трудно разделить IRedisClient.PublishMessageи, IMessageQueueClient.Publishи я понимаю, что, должно быть, что-то путаю.

ServiceStack дает нам возможность прослушивать трансляции pub / sub следующим образом:

    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"));
    }

Выглядит красиво, прямолинейно. А как же продюсер?

Глядя на доступные классы, я подумал, что можно использовать IRedisClient.PublishMessage(string toChannel, string message)либо IMessageQueueClient.Publish(string queueName, IMessage message).

redisClient.PublishMessage("Test", json);
// or:     
myMessageQueueClient.Publish("Test", new Message<CoreEvent>(testReq));

В обоих случаях вы указываете название канала самостоятельно. Я наблюдаю вот такое поведение:

  • подписчик, указанный выше, получает сообщение, только если я использую, IRedisClient.PublishMessage(string toChannel, string message)и никогда, если я используюIMessageQueueClient.Publish(string queueName, IMessage message)
  • Если я публикую с использованием IRedisClient.PublishMessage, я ожидал, что канал «Test» будет заполнен (если я просматриваю с помощью браузера Redis), но это не так. Я никогда не вижу следов очереди (допустим, я не начинаю подписку, но производители добавляют сообщения)
  • Если я публикую с использованием IMessageQueueClient.Publish(string queueName, IMessage message), создается канал «Тест», и сообщения сохраняются там, но никогда не извлекаются / не извлекаются и не удаляются.

Я хочу понять разницу между ними. Я просмотрел исходный код и прочитал все, что мог, но не нашел документации по этому поводу IRedisClient.PublishMessage.

Ответы

Ted Aug 17 2020 at 21:29

Mythz ответил на это на форуме ServiceStack здесь .

Он пишет:

Эти клиенты не должны использоваться взаимозаменяемо, вы должны использовать только клиенты ServiceStack MQ для отправки сообщений MQ или оболочки сообщений MQ Message.

Подписка Redis - это низкоуровневый API для создания подписки Redis Pub / Sub, более полезным API более высокого уровня является Managed Pub / Sub Server, который обертывает подписку pub / sub за управляемым потоком.

В любом случае MQ Server предназначен только для обработки сообщений от клиентов MQ, если вы собираетесь реализовать свою собственную реализацию обмена сообщениями, используйте свои собственные клиенты сообщений и redis, а не клиенты MQ или класс сообщений MQ.

а также

API-интерфейсы IRedisClient (& ServiceStack.Redis) не предназначены для Redis Server, API-интерфейс PublishMessage отправляет команду redis PUBLISH. IRedisSubscription создает подписку Redis Pub / Sub, см. Документацию Redis, чтобы узнать, как работает Redis Pub / Sub. Библиотека ServiceStack.Redis и все ее API предназначены только для Redis Server, она не содержит никаких API MQ ServiceStack.Messaging.

Поэтому просто используйте ServiceStack.Redis для своей собственной реализации подписки Redis Pub / Sub, т.е. не используйте какие-либо API-интерфейсы ServiceStack.Messaging, предназначенные только для ServiceStack MQ.