Mencari pemahaman tentang ServiceStack.Redis: IRedisClient.PublishMessage vs IMessageQueueClient.Publish
Saya mengalami kesulitan untuk memisahkan IRedisClient.PublishMessage
dan IMessageQueueClient.Publish
dan menyadari bahwa saya harus mencampurkan sesuatu.
ServiceStack memberi kami opsi untuk mendengarkan siaran pub / sub seperti ini:
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"));
}
Terlihat bagus, lugas. Tapi bagaimana dengan produsernya?
Saat melihat kelas yang tersedia, saya pikir seseorang dapat menggunakan IRedisClient.PublishMessage(string toChannel, string message)
atau IMessageQueueClient.Publish(string queueName, IMessage message)
.
redisClient.PublishMessage("Test", json);
// or:
myMessageQueueClient.Publish("Test", new Message<CoreEvent>(testReq));
Dalam kedua kasus tersebut, Anda menentukan sendiri nama saluran. Inilah perilaku yang saya lihat:
- pelanggan di atas hanya menerima pesan jika saya menggunakan
IRedisClient.PublishMessage(string toChannel, string message)
dan tidak pernah jika saya menggunakanIMessageQueueClient.Publish(string queueName, IMessage message)
- Jika saya memublikasikan menggunakan
IRedisClient.PublishMessage
, saya berharap saluran "Test" diisi (jika saya melihat dengan browser Redis), tetapi ternyata tidak. Saya tidak pernah melihat jejak antrian (katakanlah saya tidak mulai berlangganan, tetapi produser menambahkan pesan) - Jika saya memublikasikan menggunakan
IMessageQueueClient.Publish(string queueName, IMessage message)
, saluran "Test" dibuat dan pesan tetap ada di sana, tetapi tidak pernah muncul / diambil-dan-dihapus.
Saya ingin memahami perbedaan antara keduanya. Saya telah melihat kode sumber dan membaca semua yang saya bisa tentangnya, tetapi saya belum menemukan dokumentasi apa pun tentang IRedisClient.PublishMessage
.
Jawaban
Mythz menjawab ini di forum ServiceStack, di sini .
Dia menulis:
Klien ini tidak boleh digunakan secara bergantian, Anda hanya boleh menggunakan klien ServiceStack MQ untuk mengirim Pesan MQ atau pembungkus Pesan MQ Pesan.
Langganan redis adalah API tingkat rendah untuk membuat langganan Redis Pub / Sub, API tingkat tinggi yang lebih berguna adalah Server Pub / Sub Terkelola yang membungkus langganan pub / sub di belakang utas terkelola.
Either way, MQ Server hanya dirancang untuk memproses pesan dari klien MQ, jika Anda akan menerapkan implementasi perpesanan Anda sendiri, gunakan pesan Anda sendiri & redis klien bukan klien MQ atau kelas Pesan MQ.
dan
Tidak ada API IRedisClient (& ServiceStack.Redis) untuk Redis Server, API PublishMessage mengirimkan perintah redis PUBLISH. IRedisSubscription membuat langganan Redis Pub / Sub, lihat dokumen Redis untuk mempelajari cara kerja Redis Pub / Sub. Pustaka ServiceStack.Redis dan semua API-nya hanya untuk Redis Server, ia tidak berisi API MQ ServiceStack.Messaging apa pun.
Jadi, cukup gunakan ServiceStack.Redis untuk implementasi langganan Redis Pub / Sub kustom Anda, yaitu jangan gunakan API ServiceStack.Messaging apa pun yang hanya untuk ServiceStack MQ.