В поисках понимания 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)
, создается канал «Тест», и сообщения сохраняются там, но никогда не извлекаются / не извлекаются и не удаляются.
Я хочу понять разницу между ними. Я просмотрел исходный код и прочитал все, что мог, но не нашел документации по этому поводу IRedisClient.PublishMessage
.
Ответы
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.