项目分布式部署那些事(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的默认端口号请加上端口号,例:

在<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:

为什么放弃Redis?

因为我们Redis是需要自己部署的,而自己部署意味着要花经历去维护这样一套Redis的方案,而一开始我们以为一台简单的服务器简单的安装配置一下Redis就可以负荷我们现在的应用了(我们的应用目前只有Session使用了它),可事与愿违再部署上去的过程中经常出现redis服务挂掉,启动不起来的情况,随后我们咬了咬牙决定使用阿里云的OCS(开放缓存服务)来构建我们的Session共享和分布式缓存。

OCS的缺点

然而阿里云的OCS在我眼中并不完美,下面我们来看看它的缺点。

  1. 外网无法访问(意味着我们不能在本地开放环境中进行测试调试)
  2. 阿里云官方没有提供针对于.NET/C#的SDK(需要使用第三方的,但我们使用的第三方SDK无法支持阿里云OCS控制台中 缓存数据管理 - 视图操作)
  3. 价格其实并不便宜

关于第一点,不像ONS那样可以在外网访问,但不承诺稳定性,至少我们可以在开放环境进行调试,这一点是比较不能忍受的,现在我们只能在本地部署Memcached进行开放环境的调试

关于第二点OCS兼容了Memcached所以我们可以使用任何关于Memcached的SDK,而我们使用的是:Enyim.Caching

关于第三点,它是按小时收费的。。具体看图吧(我们开通了并没有几天)

关于Session共享的方案

分布式相关开源地址:https://github.com/RabbitTeam/Distributed

开源地址:https://github.com/RabbitTeam/Distributed/tree/master/Distributed/Distributed.SessionProvider.Memcached

在NuGet

地址: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

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

五重备份无一有效,还有哪些 rm -rf 和GitLab类似的忧伤?

DBA的悲伤,不是没有做备份,就是没有做有效的备份。日光之下,并无鲜事。 都说一个没有删过数据库的DBA,职业生涯是不完整的,不过当你删过之后,你的DBA生涯可...

3985
来自专栏高性能服务器开发

(八)高性能服务器架构设计总结4——以flamigo服务器代码为例

一个项目的服务器端往往由很多服务组成,就算单个服务在性能上做到极致,支持的并发数量也是有限的。举个简单的例子,假如一个聊天服务器,每个用户的信息是1k,那对于一...

1105
来自专栏FreeBuf

如何使用Airgeddon搭建基于软件的WIFI干扰器

Airgeddon是一款能够进行Wi-Fi干扰的多Bash网络审计工具,它可以允许你在未加入目标网络的情况下设置目标,并且断开目标网络中的所有设备。Airged...

33110
来自专栏腾讯Bugly的专栏

关于移动 App H5 页面里的 JavaScript 异常捕获

自 HTML5 标准正式发布之后,其得天独厚的跨平台特性吸引了众多开发者的目光。 伴随着 HTML5 的发展,JavaScript 的重要性也在逐步增加,要说现...

5369
来自专栏coolblog.xyz技术专栏

MyBatis 源码分析系列文章合集

我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章。起初,我只是打算通过博客的形式进行分享。但在写作的过程中,发现要分析的代码太多,以至...

1K7
来自专栏数据和云

【Windows最近肿么了】32TB的Win10源码遭泄露?

黑客泄露微软 Win 10 大量源代码,数据超过 32 TB 据 TheRegister 报道,已经有多达 32TB 的微软 Windows 操作系统的内部核心...

3218
来自专栏北京马哥教育

干货:Web应用上线之前程序员应该了解的技术细节

问题 Web 应用上线前,程序员应考虑哪些技术细节呢? 如果 Jeff Atwood 忘记把 HttpOnly cookies、sitemaps 和 cros...

3465
来自专栏即时通讯技术

技术干货:从零开始,教你设计一个百万级的消息推送系统

本文主要分享的是如何从零设计开发一个中大型推送系统,因限于篇幅,文中有些键技术只能一笔带过,建议有这方面兴趣的读者可以深入研究相关知识点,从而形成横向知识体系。

1992
来自专栏杨建荣的学习笔记

由hugepage设置导致的数据库事故(r4笔记第28天)

近期客户需要希望提高业务处理能力,在现有的系统中加入几台weblogic服务器,所以需要增加以下连接数的配置,但是同时他们想对现有系统的设置一些变更,发送了一个...

3084
来自专栏逍遥剑客的游戏开发

UE4中集成Wiimote

28311

扫码关注云+社区

领取腾讯云代金券