Redis学习笔记~分布式的Pub/Sub模式
redis的客戶端有很多,這次用它的pub/sub發(fā)布與訂閱我選擇了StackExchange.Redis,發(fā)布與訂閱大家應(yīng)該很清楚了,首先一個(gè)訂閱者,訂閱一個(gè)服務(wù),服務(wù)執(zhí)行一些處理程序(可能是寫個(gè)日志,插入個(gè)數(shù)據(jù),發(fā)個(gè)email)然后當(dāng)另一個(gè)項(xiàng)目的某個(gè)業(yè)務(wù)發(fā)布這個(gè)服務(wù)后,被訂閱的程序?qū)?huì)被執(zhí)行,這個(gè)聽起來很有意思,redis有好的實(shí)現(xiàn)了這個(gè)pub/sub功能。
看一下結(jié)構(gòu)圖
?
Sub訂閱(消息消費(fèi)者)
對(duì)于訂閱方,這里類似于一個(gè)服務(wù),它會(huì)長期運(yùn)行著,被啟動(dòng)后動(dòng)態(tài)訂閱一些服務(wù)進(jìn)來,以便以后再被其它服務(wù)調(diào)用
//sub a function in A-projectPubSubManager.Instance.Subscribe("UserLog", (msg) =>{//訂閱者處理自己的業(yè)務(wù)邏輯,這相關(guān)于隊(duì)列服務(wù)要干的事 Console.WriteLine(msg);});Pub發(fā)布(消息生產(chǎn)者)
而對(duì)于其它項(xiàng)目,如A網(wǎng)站,它可能在被在POST動(dòng)作后發(fā)布這個(gè)UserLog的服務(wù),這時(shí)上面的訂閱方將會(huì)消費(fèi)它(消費(fèi)者模式),或者服務(wù)代碼被執(zhí)行!
[HttpPost]public ActionResult Index(string user){PubSubManager.Instance.Publish("UserLog", user + "這個(gè)用戶提交表單了");return View();}對(duì)于一直運(yùn)行的服務(wù),將會(huì)收到來自不同項(xiàng)目的消息,而它只負(fù)責(zé)消費(fèi)它!
Lind.DDD.PublishSubscribe
封裝了一些標(biāo)準(zhǔn)的pub/sub方法,它可以有多種實(shí)現(xiàn)方法,本例使用redis這個(gè)中間件
/// <summary>/// 發(fā)布訂閱的接口規(guī)則/// </summary>public interface IPubSub{/// <summary>/// 發(fā)布,有順序,對(duì)象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void Publish(string channel, string value);/// <summary>/// 訂閱,對(duì)象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void Subscribe(string channel, Action<string> action);/// <summary>/// 異步發(fā)布,無順序,對(duì)象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishAsync(string channel, string value);/// <summary>/// 異步訂閱,無順序,對(duì)象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeAsync(string channel, Action<string> action);/// <summary>/// 發(fā)布,有順序,對(duì)象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishByte(string channel, byte[] value);/// <summary>/// 訂閱,對(duì)象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeByte(string channel, Action<byte[]> action);/// <summary>/// 異步發(fā)布,有順序,對(duì)象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishByteAsync(string channel, byte[] value);/// <summary>/// 異步訂閱,對(duì)象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeByteAsync(string channel, Action<byte[]> action);/// <summary>/// 發(fā)布,有順序,對(duì)象源是泛型對(duì)象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="value"></param>void Publish<T>(string channel, T value);/// <summary>/// 訂閱,對(duì)象源是泛型對(duì)象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="action"></param>void Subscribe<T>(string channel, Action<T> action);/// <summary>/// 異步發(fā)布,有順序,對(duì)象源是泛型對(duì)象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="value"></param>void PublishAsync<T>(string channel, T value);/// <summary>/// 異步訂閱,對(duì)象源是泛型對(duì)象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeAsync<T>(string channel, Action<T> action);/// <summary>/// 取消指定訂閱/// </summary>/// <param name="channel"></param>void UnSubscribe(string channel);/// <summary>/// 取消所有訂閱/// </summary>/// <param name="channel"></param>void UnSubscribeAll();}?本文轉(zhuǎn)自博客園張占嶺(倉儲(chǔ)大叔)的博客,原文鏈接:Redis學(xué)習(xí)筆記~分布式的Pub/Sub模式,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原博主。
總結(jié)
以上是生活随笔為你收集整理的Redis学习笔记~分布式的Pub/Sub模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享75个商务商城PHP源码,总有一款适
- 下一篇: linux cmake编译源码,linu