无意间看到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月分上线)
相关推荐
《大型网站技术架构演进与性能优化》这本书深入探讨了互联网行业中大型网站在技术架构上的发展路径和性能优化策略。随着互联网的飞速发展,大型网站的架构设计和性能优化成为了决定企业竞争力的关键因素。本篇文章将...
【阿里后端技术分享:大型系统架构优化与设计——天猫后端技术架构优化实践】 阿里巴巴作为全球领先的电商平台,其背后的后端技术架构是支撑庞大业务的关键。本分享主要围绕天猫后端技术架构的优化实践展开,旨在...
根据提供的信息,我们可以推断出该文档主要关注的是大型网站技术架构的核心原理及案例分析。虽然部分内容被重复的链接所占据,并未提供具体的技术细节,但我们可以基于标题、描述以及通常此类主题涵盖的内容来展开...
### 大型网站技术架构分析 #### 一、大型网站架构的目标与挑战 在探讨大型网站的技术架构之前,我们首先需要明确何为“大型”网站。通常来说,并没有一个绝对的标准来定义一个网站是否属于“大型”。然而,在实践...
总的来说,这个ASP.NET 3.5的聊天模块设计涵盖了Web开发的多个重要方面,包括异步处理、数据库交互、安全性控制、用户界面设计以及架构设计。通过学习这个模块,开发者可以深入理解ASP.NET 3.5的特性和最佳实践,为...
《大型网站技术架构》这本书深入探讨了构建高访问量、高并发、高可用性的大型网站所需的技术架构。作为一本PDF文档,它涵盖了JAVAWEB框架的诸多关键知识点,为开发者提供了宝贵的指导。 大型网站技术架构的核心在于...
《大型网站技术架构:核心原理与案例分析》是一本深入探讨构建和优化大规模网站技术架构的专业书籍。在当今互联网行业中,随着用户数量的急剧增长,网站的规模和技术复杂度也随之攀升,如何设计出高可用、高性能、可...
垂直拆分是从业务功能的角度对系统进行拆分,将原本紧密耦合的功能模块分离成独立的子系统,以便于管理和扩展。例如,将用户管理、商品信息、订单处理等功能模块拆分成不同的子系统。 - **引入服务调用治理**:解决...
- **后端优化**:采用异步处理、微服务架构、消息队列等技术。 - **数据库优化**:合理使用索引、分区、读写分离等策略。 - **运维优化**:监控系统状态、定期备份、故障转移等。 #### 6. 负载均衡技术建设高...
在Android应用开发中,模块化MVP架构是一种常见的设计模式,它将应用程序的不同部分分解为独立的模块,每个模块都有其特定的责任。这种架构模式在Kotlin中得到了广泛的应用,因为它能够提供更好的代码组织和可维护性...
淘宝是一个交易网站,其业务特性决定了技术架构的设计方向。具体包括以下几个方面: 1. **交易**:包括商品匹配、交易过程、支付、物流等环节。 2. **高流量**:每天高达7亿次的页面访问,其中搜索和浏览宝贝的数量...
标题与描述均提及了“互联网公司技术架构资料.淘宝.技术架构介绍”,这明确指出了文档的核心内容将围绕淘宝的技术架构展开。以下是对淘宝技术架构发展史及其关键知识点的详细解读。 ### 淘宝技术架构发展概览 淘宝...
在客户管理模块中,使用了 Spring MVC 框架来实现控制器、视图和模型的分离,MyBatis 框架来实现数据库的交互,freemaker 框架来实现模板引擎的功能。TOMCAT 作为 Web 服务器,提供了稳定和高效的服务。MYSQL 作为...
因此,为了应对这些挑战,大型网站的技术架构也随之不断演进和完善。本文将深入探讨大型网站架构的演变过程、关键模式、核心要素以及高性能、高可用性和伸缩性架构的设计原则。 #### 一、大型网站架构演化 1. **...
本文将详细探讨一种基于前后端分离架构的个人财务管理系统,其源码和数据库文件被封装在一个压缩包中,文件名为“BOOT-00001前后端分离个人财务管理系统源码+数据库.rar”。 前后端分离的架构模式近年来在软件开发...
微博的技术架构经历了从单一到复杂的过程,不断适应着用户数量的爆炸式增长和业务需求的变化。通过对架构的不断优化和完善,不仅解决了海量数据处理的问题,还实现了高可用性和安全性,为用户提供了一个稳定可靠的...
综上所述,这个B2C电商网站的开发综合运用了多种技术和工具,构建了一个高效、可扩展的微服务架构,实现了前后端分离,以及各个组件之间的良好协同。通过这样的设计,系统能够更好地应对高并发场景,提供稳定、安全...
ASP.NET 是微软公司推出的...总之,“ASP.NET-三层架构-花店系统网站”是一个典型的Web应用开发实例,它涵盖了Web开发中的许多核心技术和最佳实践,对于学习和理解ASP.NET以及三层架构的设计模式有着重要的参考价值。
【CMS模块化开发与大型、高负载网站架构和应用初探】 在当今互联网时代,大型、高负载的网站已经成为企业及组织在线业务的核心。CMS(Content Management System,内容管理系统)的模块化开发是构建此类网站的关键...
构建高性能web站点的知识点涵盖了从基础的网站架构设计到前端优化、后端性能提升、数据库优化、内容分发网络(CDN)的使用以及负载均衡等多个方面,每一个环节都至关重要。 1. 高效的网站架构设计: - 架构模式:...