因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作。
现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXin(开源的微信开发SDK)开发的一款微信应用类系统,主要业务是围绕当下流行的微信元素,如:微官网、微商城、微分销、营销活动、会员卡等。
关于RabbitHub详情请戳:
.NET 平台下的插件化开发内核(Rabbit Kernel)
RabbitHub开源情况及计划
关于Rabbit.WeiXin详情请戳:
.NET平台下的微信SDK(Rabbit.WeiXin)开源发布
现在的系统部署在两台物理服务器、一台云服务器上,其中云服务器部署着总站(用户信息的总站,单点登录)、ChunSunCloud(微信开放平台请求转发)项目,一台物理服务器为主要的负载服务器(数据库+web容器iis),另外一台则是一台热备服务器,主要在程序更新时使用。
现在另购了两台云服务器,一台作为数据库服务器、另外一台则配合之前的一台云服务器担任着负载服务器的角色,因为现在迁移刚进行了一半,详细的部署情况会在这个阶段的事务完成之后再与大家分享。
开源地址:https://github.com/RabbitTeam/Distributed/
在之前一直使用ASP.NET State service来解决Session共享的问题,无奈看事件日志时经常报出超时等异常,这一次花了一些时间使用了Redis实现了Session共享。
基于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,例:
在没有执行SetSession时GetSession是取不到值的。
在执行了SetSession之后GetSession是可以取到值的。
Code如下:
之前的项目中使用了SignalR做了一个简单的消息队列,无奈不是非常稳定,所以这一次打算替换掉消息队列,目前使用了阿里云的ONS,该组件还没有与现有系统对接,只是做了实现所以后期改动性较大,大家按需使用。
一个抽象的消息队列,集成了Aliyun ONS <阿里云开放消息服务>。
在设计消息队列时由于不确定后期是否继续使用阿里云的ONS,所以在核心部分进行了抽象,不直接依赖阿里云ONS的SDK,只是做了适配,所以在后期变更消息队列时比较容易,有动手精神的童鞋可以自行扩展。
抽象部分的设计结构如下:
IMessageQueueFactory:消息队列工厂,用于创建 生产者和消费者实例。
IConsumer:消费者,提供消息订阅。
IProducer:生产者,消息发送。
IConnection:连接接口,主要用于保证连接只被开启一次和关闭一次。
整体设计:
Sample:
Consumer Code:
Producer Code:
因为我们Redis是需要自己部署的,而自己部署意味着要花经历去维护这样一套Redis的方案,而一开始我们以为一台简单的服务器简单的安装配置一下Redis就可以负荷我们现在的应用了(我们的应用目前只有Session使用了它),可事与愿违再部署上去的过程中经常出现redis服务挂掉,启动不起来的情况,随后我们咬了咬牙决定使用阿里云的OCS(开放缓存服务)来构建我们的Session共享和分布式缓存。
然而阿里云的OCS在我眼中并不完美,下面我们来看看它的缺点。
关于第一点,不像ONS那样可以在外网访问,但不承诺稳定性,至少我们可以在开放环境进行调试,这一点是比较不能忍受的,现在我们只能在本地部署Memcached进行开放环境的调试。
关于第二点OCS兼容了Memcached所以我们可以使用任何关于Memcached的SDK,而我们使用的是:Enyim.Caching。
关于第三点,它是按小时收费的。。具体看图吧(我们开通了并没有几天)
分布式相关开源地址:https://github.com/RabbitTeam/Distributed
开源地址:https://github.com/RabbitTeam/Distributed/tree/master/Distributed/Distributed.SessionProvider.Memcached
地址:https://www.nuget.org/packages/Distributed.SessionProvider.Memcached/1.0.0-beta2
安装命令:Install-Package Distributed.SessionProvider.Memcached –Pre
1.设置相关配置
MemcachedServerAddress 为服务器地址(记得加上端口号哦)
MemcachedSessionKey 为Session在Memcached中占用的Key,防止冲突。
2.配置sessionState