因業務發展需要現在的系統不足以支撐現在的用戶量,於是我們在一周之前着手項目的性能優化與分布式部署的相關動作。
概況
現在的系統是基於RabbitHub(一套開源的開發時框架)和Rabbit.WeiXin(開源的微信開發SDK)開發的一款微信應用類系統,主要業務是圍繞當下流行的微信元素,如:微官網、微商城、微分銷、營銷活動、會員卡等。
關於RabbitHub詳情請戳:
.NET 平台下的插件化開發內核(Rabbit Kernel)
關於Rabbit.WeiXin詳情請戳:
.NET平台下的微信SDK(Rabbit.WeiXin)開源發布
系統概況
現在的系統部署在兩台物理服務器、一台雲服務器上,其中雲服務器部署着總站(用戶信息的總站,單點登錄)、ChunSunCloud(微信開放平台請求轉發)項目,一台物理服務器為主要的負載服務器(數據庫+web容器iis),另外一台則是一台熱備服務器,主要在程序更新時使用。
新的部署方案
現在另購了兩台雲服務器,一台作為數據庫服務器、另外一台則配合之前的一台雲服務器擔任着負載服務器的角色,因為現在遷移剛進行了一半,詳細的部署情況會在這個階段的事務完成之后再與大家分享。
這一次分享的內容
- 基於Redis的Session共享實現
- 基於阿里雲開放消息服務(ons)的消息隊列
開源地址:https://github.com/RabbitTeam/Distributed/
Session共享
在之前一直使用ASP.NET State service來解決Session共享的問題,無奈看事件日志時經常報出超時等異常,這一次花了一些時間使用了Redis實現了Session共享。
Distributed.SessionProvider.Redis
基於SessionStateStoreProviderBase無縫對接ASP.NET中的Session。
使用說明
在Web.config中配置Reids服務器地址和SessionProvider
在<appSettings>下配置key為RedisServer的項,value為redis的服務器地址,如果修改了redis的默認端口號請加上端口號,例:
在<system.web>節點下配置SessionProvider
Type為:Distributed.SessionProvider.Redis.RedisSessionStateStoreProvider,Distributed.SessionProvider.Redis,例:
Sample:
在沒有執行SetSession時GetSession是取不到值的。
在執行了SetSession之后GetSession是可以取到值的。
Code如下:
消息隊列
之前的項目中使用了SignalR做了一個簡單的消息隊列,無奈不是非常穩定,所以這一次打算替換掉消息隊列,目前使用了阿里雲的ONS,該組件還沒有與現有系統對接,只是做了實現所以后期改動性較大,大家按需使用。
Distributed.MessageQueue
一個抽象的消息隊列,集成了Aliyun ONS <阿里雲開放消息服務>。
在設計消息隊列時由於不確定后期是否繼續使用阿里雲的ONS,所以在核心部分進行了抽象,不直接依賴阿里雲ONS的SDK,只是做了適配,所以在后期變更消息隊列時比較容易,有動手精神的童鞋可以自行擴展。
抽象部分的設計結構如下:
IMessageQueueFactory:消息隊列工廠,用於創建 生產者和消費者實例。
IConsumer:消費者,提供消息訂閱。
IProducer:生產者,消息發送。
IConnection:連接接口,主要用於保證連接只被開啟一次和關閉一次。
整體設計:
Sample:
Consumer Code:
Producer Code:
寫在最后
QQ群:384413261(RabbitHub)
Email:majian159@live.com
關於這篇文章中的內容:RabbitHub、微信SDK、Session共享、消息隊列、分布式有興趣的可以入群或者私信我一起探討。