`
willwen
  • 浏览: 24514 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

网站技术架构优化-异步消息模块分离

 
阅读更多

       无意间看到ITEYE推荐《大型网站技术架构:核心原理与案例分析》,一口气看完推荐的两部分节选,

深有体会,结合鄙人所维护网站,谈下对网站技术架构优化的一些方案以及个人看法。

       首先,介绍重构前的网站架构模式:

1、同样应用系统功能采用分层,即应用层、服务层、数据层。这样分层结构,能使系统组织层次明显,以达到良好运作;

2、其次对应用层进行应用功能模块划分,并采用分布式部署(分WEB区、APP区:web区部署8个server,app区部署6个server),使用weblogic集群,提高系统可用性;

3、对页面前端的静态文件,如CSS、图片、js,采用CDN加速,提高系统响应能力;

       网站规模:截止目前,网站仍继续保持日注册量在2.5万,日登录量在55万次的访问次,网站用户数逼近2千5百万。

     以上的架构在应对如此规模的访问量上总显得力不从心,特别是在重构前APP上的server内存使用量总是逼近100%,长期处于高位。在对代码层面做优化后情况仍没有好转,最后决定对系统架构做重构,在对系统架构层面做了一番分析后,矛头直指系统的异步消息模块优化改造上。

     经分析,承担系统消息服务模块的app server即承担既是消息生产者又是消息消费者的角色,而且异步请求都是主流程中的实时性、重要性相对不是很高的,则为独立搭建消息消费者服务提供方向。

     搭建独立的消息服务app server,对保证APP端服务稳定,尽量减少关联系统异常造成的影响起到很大作用:

1、作为消息消费者,独立部署,即使消息阻塞,也能隔离影响

2、给关联系统提供接口服务,即使关联系统调用异常,也能隔离影响

3、可考虑作为后台定时任务服务器

网站的重构除了做架构消息队列分离外,前端也采用业界backboneJs前端MVC框架对页面做组织结构重构,后面有机会再另起文章写写相关内容。

        在这里将自己亲身经过的重构拿出来跟大家分享下,很多时候很难说得清楚哪种重构方案适合解决哪种类型的问题,只要是能使用较小的代价,能快速解决问题的,往这个方向设计的方案基本就差不多了。

 

下面附上当初重构遇到问题已经解决方案:

问题1:Invalid Subject

BeanCreationException: [Security:090398]Invalid Subject:jmstest

错误说明:远程调用验证不通过

原因分析:client JVM把错误的subject传递给了Remote JVM

报错代码:JmsMessengerDS jmsService = (JmsMessengerDS) context.getBean(BizContextNames.JMS_MESSENGER_DS);

解决方法:

新建类JmsJndiTemplate继承JndiTemplate并将subject缓存,在鉴权代码如下:

   Subject subject = ((JmsJndiTemplate) context.getBean("jndiJmsTemplate")).getSubject();

  try {

  Security.runAs(subject, new PrivilegedAction() {

  public Object run() {

  }

  });

 

  } catch (Exception ex) {}

 问题2:请求无法发到目标集群

 原因分析:app和message两个cluster会相互收到对方的组播包(同一个集群

中的instance才应该收到)。现在的情况是两个不同集群,提供不同服

务的集群能收到对方的组播包。app跟message在同一台主机,使用相同的IP跟端口。

所以需要将两个集群的端口换成不同。

如下是报错信息:

<2013-6-3 上午09时21分10秒 CST> <Error> <Cluster> <BEA-000110>

<Multicast socket receive error: java.io.OptionalDataException

java.io.OptionalDataException at

java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1285)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:322)

Atweblogic.cluster.MulticastManager.execute(MulticastManager.java:5

16) At

weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)

at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)> 

 

问题3:服务器依赖问题

 现象分析:原先设计逻辑在message server重启后,没有再重新lookup,造成APP server跟MESSAGE server之间存在依赖关系

解决方案:

新写JmsJndiObjectFactoryBean类替换JndiObjectFactoryBean类,当获取对象时判断jndiObject是否为空,如果为空,则再lookup一次

if (this.jndiObject == null) {

// 如果服务启动时,远程的JMS没有启动,afterPropertiesSet()调用会失败,jndiObject为null,

// 在这里补调一次

try {

afterPropertiesSet();

} catch (IllegalArgumentException e) {

logger.warn("远程服务可能还没有启动", e);

} catch (NamingException e) {

logger.warn("远程服务可能还没有启动", e);

}

}

return this.jndiObject;

 

问题4:请求还是落在本地集群

 

} 现象描述:当APP跟MESSAGE改成使用不同的端口,APP发出的请求还是落在MESSAGE上。

原因分析:可以从MESSAGE的console上分析看到,实际上APP中的消息已经发送到MESSAGE上JMS SERVER上,这是由于MESSAGE上的MessageDrivenBean获取请求解析对应的ActionID,而对ActionID的调用是通过PafaAC完成,此时需要把MESSAGE上的properties文件中关于PafaAC的T3地址配置成MESSAGE所在的服务地址即可

 

问题5:JMS重启后链接失效

现象描述:

当message server重启后,再发起交易会报发送失败错误:MessengerDS send message failure

原因分析:

QueueConnection作为单例,每个client和jms server只建立一次连接(start一次),相当socket通道打通,就一致不关闭

当jms server挂或者重启的时候,该连接则不可用了

所以在queueConnection.createQueueSession创建session时候,发现connection不可用,关闭以前的connection并设置connection为null,

下次请求时候,重新获取connection并重新start

// 发送之前进行初始化,已支持延迟加载

synchronized (this) {

if (queueConnection == null) {

try {

queueConnection = queueConnectionFactory

.createQueueConnection();

queueConnection.start();

} catch (JMSException jmsEx) {

queueConnection = null;

throw new RuntimeException(

START_CONNECTION_FAILURE);

}

}

 

}

 

 改造上线后server内容消耗情况,相比之前有明显回落(7月分上线)

 

 

 

 

 

 

 

 

 

  • 大小: 113.6 KB
分享到:
评论

相关推荐

    基于PHP 打听网Wordpress CMS的毕业设计,PHP7.0+MySQL5.7+Wordpress5.0+MVC+Aja

    本毕设的开发环境为PHP7.0+、MySQL5.7+、Wordpress5.0+,采用了MVC架构和Ajax技术,实现了前后端分离和异步交互。 总体来说,本毕设既考验了PHP和Wordpress的开发能力,也体现了对用户需求的理解和实现

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    性能优化架构能力 代码级别 关联代码优化 cache对其 分支预测 copy on write 内联优化 系统优化 cache 延迟计算 数据预读 异步 轮询与通知 内存池 模块化 工程架构能力 开发语言 运维与监控 监控...

    fs-company 企业网站系统 v1.1.1.rar

    fs-company v1.1.1 是由佛山网基网络工作室开发的基于Asp Access IIs架构的快速搭建企业网站的程序,是fs-company_V1.1.0_sc_gbk的新版本。该程序完全免费,没有功能限制,欢迎大家使用它搭建网站。 后台路径:/...

    爱革CMS(公司网站) 3.0.rar

    爱革CMS目前包括系统模块,会员模块,广告模块,文章模块,网址模块,留言模块,网店模块,音乐模块,图片模块,电影模块,视频模块,下载模块,主机模块。 爱革CMS(公司网站) 3.0 功能说明: 1.爱革CMS是开放的...

    爱革CMS(门户网站) 3.0.rar

    爱革CMS目前包括系统模块,会员模块,广告模块,文章模块,网址模块,留言模块,网店模块,音乐模块,图片模块,电影模块,视频模块,下载模块,主机模块。 爱革CMS(门户网站) 3.0 功能说明: 1.爱革CMS是开放的...

    ASP基于BS架构个人网站毕业设计(源代码+thesis).zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    md格式编写的良心教程 Python 100天从新手到大师 共100个完整源文件 含课程源代码.rar

    【课程内容列表】 .gitignore PEP8风格指南.md Python编程惯例.md Python参考书籍.md Python之禅.md README.md 更新日志.md 玩转PyCharm.md ...电商网站技术要点剖析.md Day91-100\98.项目部署上线和性能调优.md

    SpringCloud 医疗云平台

    5) RocketMQ 发布订阅消息队列,实现模块解耦和异步处理; 6) 支付模块,支持支付宝沙箱及现金支付环境; 7) 精准细粒的业务功能讲解; 8) Docker 的项目发布和动态扩容; 9) Nginx 的负载均衡。

    基于SpringBoot+vueJAVA的房地产销售管理系统的设计与实现(源码+部署说明+演示视频+源码介绍).zip

    系统优化:系统采用了多种优化手段,如缓存技术、异步处理等,提高了系统的响应速度和稳定性。 本资源包含了系统的源码、部署说明、演示视频以及源码介绍,可以帮助您快速搭建和运行房地产销售管理系统。通过阅读...

    SmartSite智能网站管理系统 v2.9.1.rar

    SmartSite采用了目前流行的数据与界面分离技术,支持CMS主题模版的本地安装和远程自动安装,支持主题的可视化在线设置与编辑。支持多主题,多皮肤文件的自由切换与管理。建立网站可以异步进行网页内容添加和主题设计...

    asp.net知识库

    技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则...

    信息办公基于Ajax+J2EE的MicroERP源码下载-microerp-0.1.rar

    该系统采用了当下流行的前后端分离架构,通过Ajax技术实现了前端页面与后端服务器之间的异步数据交互,大大提升了用户的操作体验。作为一款适用于毕业设计或课程设计的项目,MicroERP-0.1版本提供了完整的JSP和Java...

    XiaoMiStore.zip

    由于没有实现数据库和后台模块等功能, 项目的测试数据我采用的是JSON格式的数据文件,通过AJax请求完成整个前台功能的数据交互, 后期再考虑实现一个后台管理系统及数据库系统,还有前端页面资源的异步加载及优化。

    MusiCMS音乐内容管理系统 v1.0 beta bulid 090413.rar

    本系统是针对专业级音乐试听网站而设计的,采用DIV CSS布局、生成纯静态页面、AJAX异步加载部分数据、多服务器文件存储和数据缓存机制,这大大缓解了服务器的压力,可支撑庞大的访问量;随着互联网的迅猛发展,如今...

    基于JSP的畅想空间电子商务系统.rar

    同时,系统采用了分层架构设计,使得数据层、业务逻辑层和表现层分离,这不仅有助于提高代码的可读性和可维护性,也方便开发者进行模块化扩展或二次开发。在技术栈上,该资料包不仅包括了标准的JSP技术,还可能结合...

    基于springcloud+Netty+MQ+mysql的分布式即时聊天系统源码+数据库+项目说明.zip

    RocketMQ 作为消息队列,处理聊天消息的异步入库以及解决分布式 Netty 节点问题; Zookeeper 用于分布式 id 的生成;Redis 用于记录用户在线状态以及记录 Netty 节点的元数据;MySQL 对数据进行持久化。 ## 运行...

    Ajax-shoppingPro.zip

    为了便于此项目日后的完善和扩展, 我采用了前后端分离的架构设计。前端主要使用javaScript,jquery,AjAX,JSP构建的单页web应用, 通过使用指令,服务,模板,控制器完成前端的MVC分层,各个模板页面的效果实现则使用...

    图书管理系统小程序开发.zip

    项目功能不是很多,但是前后端分离的项目,该用到的技术点也都会涉及到,很适合开始准备学vue的同学。 book-ms-ui特点 完备组织架构体系,基于RBAC 模型实现用户权限配置 基于导航守卫,动态生成路由、用户菜单、...

    JAVA毕业设计之springboot018母婴商城(springboot+mysql)完整源码.zip

    该系统采用了当下流行的微服务架构,以Spring Boot作为后端开发框架,MySQL作为数据库管理系统,实现了一个功能完善的母婴商城系统。主要功能包括:用户模块:注册、登录、修改个人信息、查询订单等;商品模块:商品...

    JAVA毕业设计之springboot063知识管理系统(springboot+mysql)完整源码.zip

    使用Ajax技术实现异步数据交互,提高了用户体验。应用场景:本项目适用于学校、企业、团队等场景,帮助用户管理和分享知识,提高工作效率。总之,这个项目是一个功能完善、技术先进的知识管理系统,可以帮助你快速...

Global site tag (gtag.js) - Google Analytics