В поисках понимания 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.