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

Мне трудно разделить 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), создается канал "Test", и сообщения сохраняются в нем, но никогда не извлекаются / не извлекаются и не удаляются.

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

1 ответ

Решение

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

Он пишет:

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

Подписка 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.

Другие вопросы по тегам