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

因業務發展須要如今的系統不足以支撐如今的用戶量,因而咱們在一週以前着手項目的性能優化與分佈式部署的相關動做。html

 

概況

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

關於RabbitHub詳情請戳:github

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

RabbitHub開源狀況及計劃redis

關於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共享、消息隊列、分佈式有興趣的能夠入羣或者私信我一塊兒探討。

相關文章
相關標籤/搜索