項目分布式部署那些事(1):ONS消息隊列、基於Redis的Session共享,開源共享


因業務發展需要現在的系統不足以支撐現在的用戶量,於是我們在一周之前着手項目的性能優化與分布式部署的相關動作。

 

概況

現在的系統是基於RabbitHub(一套開源的開發時框架)和Rabbit.WeiXin(開源的微信開發SDK)開發的一款微信應用類系統,主要業務是圍繞當下流行的微信元素,如:微官網、微商城、微分銷、營銷活動、會員卡等。

關於RabbitHub詳情請戳:

.NET 平台下的插件化開發內核(Rabbit Kernel)

RabbitHub開源情況及計划

關於Rabbit.WeiXin詳情請戳:

.NET平台下的微信SDK(Rabbit.WeiXin)開源發布

系統概況

現在的系統部署在兩台物理服務器、一台雲服務器上,其中雲服務器部署着總站(用戶信息的總站,單點登錄)、ChunSunCloud(微信開放平台請求轉發)項目,一台物理服務器為主要的負載服務器(數據庫+web容器iis),另外一台則是一台熱備服務器,主要在程序更新時使用。

新的部署方案

現在另購了兩台雲服務器,一台作為數據庫服務器、另外一台則配合之前的一台雲服務器擔任着負載服務器的角色,因為現在遷移剛進行了一半,詳細的部署情況會在這個階段的事務完成之后再與大家分享。

這一次分享的內容

  1. 基於Redis的Session共享實現
  2. 基於阿里雲開放消息服務(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的默認端口號請加上端口號,例:

image

<system.web>節點下配置SessionProvider

Type為:Distributed.SessionProvider.Redis.RedisSessionStateStoreProvider,Distributed.SessionProvider.Redis,例:

image

Sample:

在沒有執行SetSession時GetSession是取不到值的。

image

在執行了SetSession之后GetSession是可以取到值的。

image

Code如下:

image

消息隊列

之前的項目中使用了SignalR做了一個簡單的消息隊列,無奈不是非常穩定,所以這一次打算替換掉消息隊列,目前使用了阿里雲的ONS,該組件還沒有與現有系統對接,只是做了實現所以后期改動性較大,大家按需使用。

Distributed.MessageQueue

一個抽象的消息隊列,集成了Aliyun ONS <阿里雲開放消息服務>。

在設計消息隊列時由於不確定后期是否繼續使用阿里雲的ONS,所以在核心部分進行了抽象,不直接依賴阿里雲ONS的SDK,只是做了適配,所以在后期變更消息隊列時比較容易,有動手精神的童鞋可以自行擴展。

抽象部分的設計結構如下:

image

IMessageQueueFactory:消息隊列工廠,用於創建 生產者和消費者實例。

IConsumer:消費者,提供消息訂閱。

IProducer:生產者,消息發送。

IConnection:連接接口,主要用於保證連接只被開啟一次和關閉一次。

整體設計:

image

Sample:

image

Consumer Code:

image

Producer Code:

image

寫在最后

QQ群:384413261(RabbitHub)

Email:majian159@live.com

關於這篇文章中的內容:RabbitHub、微信SDK、Session共享、消息隊列、分布式有興趣的可以入群或者私信我一起探討。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM