项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作。
概况
现在的系统是基于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共享、消息队列、分布式有兴趣的可以入群或者私信我一起探讨。