精华内容
下载资源
问答
  • 大型网站的架构

    千次阅读 多人点赞 2019-01-01 13:28:14
    需求快速变更,发布频繁 渐进式发展 二、大型网站的架构演化发展历程 1、初始阶段的网站架构 最开始网站的应用程序、数据库、文件等所有的资源都在一台服务器上。最典型的就是LAMP技术了:服务器操作系统使用...

    一、大型网站的软件系统的特点

    • 高并发,大流量
    • 高可用
    • 海量数据
    • 用户分布广泛,网络情况复杂
    • 安全环境恶劣
    • 需求快速变更,发布频繁
    • 渐进式发展

    二、大型网站的架构演化发展历程

    1、初始阶段的网站架构

    最开始网站的应用程序、数据库、文件等所有的资源都在一台服务器上。最典型的就是LAMP技术了:服务器操作系统使用Linux,应用程序使用PHP开发,数据库使用MySQL,然后部署在Apache上。

    2、应用服务和数据服务分离

    随着网站业务的发展,一台服务器的性能和存储空间逐渐不能满足需求,这时就将应用和数据分离,整个网站使用三台服务器:应用服务器、文件服务器和数据库服务器。三台服务器对硬件资源的要求也各不相同:应用服务器需要更快更强大的CPU,数据库服务器需要更快的硬盘的更大的内存,文件服务器需要更大的硬盘。

    3、使用缓存改善网站性能

    网站访问特点和现实世界的财富分配一样遵循二八定律:80%的业务访问集中在20%的数据上。把大部分业务访问的小部分数据缓存在内存中,可以减少数据库的访问压力,提高整个网站的数据访问速度。

    缓存可以分为两种:应用服务器上的本地缓存和分布式缓存服务器上的远程缓存。本地缓存访问速度更快,但缓存数据有限,而且会出现和应用程序争用内存的情况。远程缓存可以使用集群的方式,理论上可以做到不受内存容量的限制。

    4、使用应用服务器集群改善网站的并发处理能力

    一台应用服务器所能处理的请求有限(一台Tomcat大概六七百),企图去换更强大的服务器也终究会满足不了持续增长的业务需求,而且网站有访问高峰期和低谷期,扩展性也不好。使用集群是网站解决高并发、海量数据问题的常用手段。通过负载均衡调度服务器,可将来自用户浏览器的访问请求分发到应用服务器集群中的任何一台服务器上。

    5、数据库读写分离

    使用缓存后,仍有一部分读操作(缓存访问不命中、缓存过期)和全部的写操作需要访问数据库。数据库服务器也终究会因为负载压力过高而成为网站的瓶颈。

    目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库服务器的数据更新同步到另一台数据库服务器。

    应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据。

    6、使用反向代理和CDN加速网站响应

    CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。

    7、使用分布式文件系统和分布式数据库系统

    只有在单表数据规模非常庞大的时候才使用分布式数据库。网站更常用的数据库拆分手段是业务分库。

    8、使用NoSQL和搜索引擎

    随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,关系型数据库逐渐不能满足需求。网站需要采用一些非关系型数据库技术如NoSQL和非数据库查询技术如搜索引擎。

    9、业务拆分

    大型网站为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站按业务拆分,如购物系统将首页、商铺、订单、购物车、支付等分成不同模块,分归不同的团队负责,作为不同的应用独立开发和独立部署。用得最多的是各应用通过访问同一个数据存储系统来构成一个关联的完整系统。

    10、分布式服务

    既然每一个应用系统都需要执行许多相同的业务操作,比如用户管理、商品管理等,那么可以将这些公用的业务提取出来,独立部署。由这些可复用的业务连接数据库,提供公用业务服务,而应用系统只需要管理用户界面,通过分布式服务调用共用业务服务完成具体业务操作。

    三、大型网站的架构模式

    1、分层

    对网站软件系统在横向方面进行切分,分为应用层、服务层、数据层。

    • 应用层:负责具体业务和视图展示,如网站首页及搜索输入和结果展示。
    • 服务层:为应用层提供服务支持,如用户管理服务、购物车服务等。
    • 数据层:提供数据存储访问服务,如数据库、缓存、文件、搜索引擎等。

    2、分割

    在纵向方向对软件进行切分,将网站按不同的功能和服务分割,包装成高内聚低耦合的模块单元。一方面有助于软件的开发和维护,另一方面便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。比如将软件系统的购物、论坛、搜索、广告分割成不同的应用。

    3、分布式

    在网站应用中,常用的分布式方案有以下几种。

    • 分布式应用和服务:将分层和分割后的应用和服务模块分布式部署。
    • 分布式静态资源:网站的静态资源如JS、CSS、Logo图片等资源独立分布式部署。
    • 分布式数据和存储:为网站应用而生的各种NoSQL产品几乎都是分布式的。
    • 分布式计算:Hadoop及其MapReduce分布式计算框架,移动计算而不是移动数据。
    • 分布式配置:支持网站线上服务器配置实时更新。
    • 分布式锁:分布式环境下实现并发和协同。
    • 分布式文件系统:FastDFS、HDFS。

    4、集群

    提高网站高并发和高可用的能力。

    5、缓存

    提高数据访问速度。

    • CDN
    • 反向代理
    • 本地缓存
    • 分布式缓存

    6、异步

    • 降低软件耦合性。
    • 提高系统可用性。
    • 加快网站相应速度。
    • 消除并发访问高峰。

    7、冗余

    服务器故障时保证数据不丢失。

    8、自动化

    • 发布过程自动化
    • 自动化代码管理
    • 自动化测试
    • 自动化安全检测
    • 自动化部署
    • 自动化监控
    • 自动化报警
    • 自动化失效转移
    • 自动化失效恢复
    • 自动化降级
    • 自动化分配资源

    9、安全

    • 通过密码和手机验证码进行身份认证。
    • 对网络传输数据进行加密。
    • 使用验证码识别机器人程序滥用网络资源攻击网站。
    • 攻击网站的XSS攻击、SQL注入进行编码转换。
    • 垃圾信息、敏感信息的过滤。
    • 交易转账等重要操作的风险控制。

    四、大型网站的架构技术一览

    1、前端架构

    • 浏览器优化技术
    • CDN
    • 动静分离,静态资源独立部署
    • 图片服务
    • 反向代理
    • DNS

    2、应用层架构

    • 开发框架
    • 页面渲染
    • 负载均衡
    • Session管理
    • 动态页面静态化
    • 业务拆分
    • 虚拟化服务器

    3、服务层架构

    • 分布式消息
    • 分布式服务
    • 分布式缓存
    • 分布式配置

    4、存储层架构

    • 分布式文件
    • 关系数据库
    • NoSQL数据库
    • 数据同步

    5、后台架构

    • 搜索引擎
    • 数据仓库
    • 推荐系统

    6、数据采集与监控

    • 浏览器数据采集
    • 服务器业务数据采集
    • 服务器性能数据采集
    • 系统监控
    • 系统报警

    7、安全架构

    • Web攻击
    • 数据保护

    8、数据中心机房架构

    • 机房架构
    • 机柜架构 
    • 服务器架构

    本文主要摘自 阿里大牛 李智慧 写的《大型网站技术架构·核心原理与案例分析》。

    展开全文
  • 大型分布式网站架构技术总结

    万次阅读 2018-03-08 18:09:35
    本文是学习大型分布式网站架构的技术总结。对架构一个高性能,高可用,可伸缩,可扩展的分布式网站进行了概要性描述,并给出一个架构参考。一部分为读书笔记,一部分是个人经验总结。对大型分布式网站架构有很好的...

    本文是学习大型分布式网站架构的技术总结。对架构一个高性能,高可用,可伸缩,可扩展的分布式网站进行了概要性描述,并给出一个架构参考。一部分为读书笔记,一部分是个人经验总结。对大型分布式网站架构有很好的参考价值。

    本次分享大纲如下

    1. 大型网站的特点
    2. 大型网站架构目标
    3. 大型网站架构模式
    4. 高性能架构
    5. 高可用架构
    6. 可伸缩架构
    7. 可扩展架构
    8. 安全架构
    9. 敏捷架构
    10. 大型架构举例

    一、大型网站的特点

    • 用户多,分布广泛
    • 大流量,高并发
    • 海量数据,服务高可用
    • 安全环境恶劣,易受网络攻击
    • 功能多,变更快,频繁发布
    • 从小到大,渐进发展
    • 以用户为中心
    • 免费服务,付费体验

    二、大型网站架构目标

    • 高性能:提供快速的访问体验。
    • 高可用:网站服务一直可以正常访问。
    • 可伸缩:通过硬件增加/减少,提高/降低处理能力。
    • 安全性:提供网站安全访问和数据加密,安全存储等策略。
    • 扩展性:方便的通过新增/移除方式,增加/减少新的功能/模块。
    • 敏捷性:随需应变,快速响应;

    三、大型网站架构模式

    • 分层:一般可分为,应用层,服务层,数据层,管理层,分析层;
    • 分割:一般按照业务/模块/功能特点进行划分,比如应用层分为首页,用户中心。
    • 分布式:将应用分开部署(比如多台物理机),通过远程调用协同工作。
    • 集群:一个应用/模块/功能部署多份(如:多台物理机),通过负载均衡共同提供对外访问。
    • 缓存:将数据放在距离应用或用户最近的位置,加快访问速度。
    • 异步:将同步的操作异步化。客户端发出请求,不等待服务端响应,等服务端处理完毕后,使用通知或轮询的方式告知请求方。一般指:请求——响应——通知 模式。
    • 冗余:增加副本,提高可用性,安全性,性能。
    • 安全:对已知问题有有效的解决方案,对未知/潜在问题建立发现和防御机制。
    • 自动化:将重复的,不需要人工参与的事情,通过工具的方式,使用机器完成。
    • 敏捷性:积极接受需求变更,快速响应业务发展需求。

    四、高性能架构

    以用户为中心,提供快速的网页访问体验。主要参数有较短的响应时间,较大的并发处理能力,较高的吞吐量,稳定的性能参数。

    可分为前端优化,应用层优化,代码层优化,存储层优化。

    前端优化:网站业务逻辑之前的部分;

    浏览器优化:减少Http请求数,使用浏览器缓存,启用压缩,Css Js位置,Js异步,减少Cookie传输;

    CDN加速,反向代理;

    应用层优化:处理网站业务的服务器。使用缓存,异步,集群

    代码优化:合理的架构,多线程,资源复用(对象池,线程池等),良好的数据结构,JVM调优,单例,Cache等;

    存储优化:缓存,固态硬盘,光纤传输,优化读写,磁盘冗余,分布式存储(HDFS),NOSQL等;

    五、高可用架构

    大型网站应该在任何时候都可以正常访问。正常提供对外服务。因为大型网站的复杂性,分布式,廉价服务器,开源数据库,操作系统等特点。要保证高可用是很困难的,也就是说网站的故障是不可避免的。

    如何提高可用性,就是需要迫切解决的问题。首先,需要从架构级别,在规划的时候,就考虑可用性。行业内一般用几个9表示可用性指标。比如四个9(99.99),一年内允许的不可用时间是53分钟。

    不同层级使用的策略不同,一般采用冗余备份和失效转移解决高可用问题。

    应用层:一般设计为无状态的,对于每次请求,使用哪一台服务器处理是没有影响的。一般使用负载均衡技术(需要解决Session同步问题),实现高可用。

    服务层:负载均衡,分级管理,快速失败(超时设置),异步调用,服务降级,幂等设计等。

    数据层:冗余备份(冷,热备[同步,异步],温备),失效转移(确认,转移,恢复)。数据高可用方面著名的理论基础是CAP理论(持久性,可用性,数据一致性[强一致,用户一致,最终一致])

    六、可伸缩架构

    伸缩性是指在不改变原有架构设计的基础上,通过添加/减少硬件(服务器)的方式,提高/降低系统的处理能力。

    应用层:对应用进行垂直或水平切分。然后针对单一功能进行负载均衡(DNS,HTTP[反向代理],IP,链路层)。

    服务层:与应用层类似;

    数据层:分库,分表,NOSQL等;常用算法Hash,一致性Hash。

    七、可扩展架构

    可以方便的进行功能模块的新增/移除,提供代码/模块级别良好的可扩展性。

    模块化,组件化:高内聚,内耦合,提高复用性,扩展性。

    稳定接口:定义稳定的接口,在接口不变的情况下,内部结构可以“随意”变化。

    设计模式:应用面向对象思想,原则,使用设计模式,进行代码层面的设计。

    消息队列:模块化的系统,通过消息队列进行交互,使模块之间的依赖解耦。

    分布式服务:公用模块服务化,提供其他系统使用,提高可重用性,扩展性。

    八、安全架构

    对已知问题有有效的解决方案,对未知/潜在问题建立发现和防御机制。对于安全问题,首先要提高安全意识,建立一个安全的有效机制,从政策层面,组织层面进行保障。比如服务器密码不能泄露,密码每月更新,并且三次内不能重复;每周安全扫描等。以制度化的方式,加强安全体系的建设。同时,需要注意与安全有关的各个环节。安全问题不容忽视。包括基础设施安全,应用系统安全,数据保密安全等。

    基础设施安全:硬件采购,操作系统,网络环境方面的安全。一般采用,正规渠道购买高质量的产品,选择安全的操作系统,及时修补漏洞,安装杀毒软件防火墙。防范病毒,后门。设置防火墙策略,建立DDOS防御系统,使用攻击检测系统,进行         子网隔离等手段。

    应用系统安全:在程序开发时,对已知常用问题,使用正确的方式,在代码层面解决掉。防止跨站脚本攻击(XSS),注入攻击,跨站请求伪造(CSRF),错误信息,HTML注释,文件上传,路径遍历等。还可以使用Web应用防火墙(比如:ModSecurity),进行安全漏洞扫描等措施,加强应用级别的安全。

    数据保密安全:存储安全(存在在可靠的设备,实时,定时备份),保存安全(重要的信息加密保存,选择合适的人员复杂保存和检测等),传输安全(防止数据窃取和数据篡改);

    常用的加解密算法(单项散列加密[MD5,SHA],对称加密[DES,3DES,RC]),非对称加密[RSA]等。

    九、敏捷性

    网站的架构设计,运维管理要适应变化,提供高伸缩性,高扩展性。方便的应对快速的业务发展,突增高流量访问等要求。

    除上面介绍的架构要素外,还需要引入敏捷管理,敏捷开发的思想。使业务,产品,技术,运维统一起来,随需应变,快速响应。

    十、大型架构举例

    点击查看大图

    以上采用七层逻辑架构,第一层客户层,第二层前端优化层,第三层应用层,第四层服务层,第五层数据存储层,第六层大数据存储层,第七层大数据处理层。

    客户层:支持PC浏览器和手机APP。差别是手机APP可以直接访问通过IP访问,反向代理服务器。

    前端层:使用DNS负载均衡,CDN本地加速以及反向代理服务;

    应用层:网站应用集群;按照业务进行垂直拆分,比如商品应用,会员中心等;

    服务层:提供公用服务,比如用户服务,订单服务,支付服务等;

    数据层:支持关系型数据库集群(支持读写分离),NOSQL集群,分布式文件系统集群;以及分布式Cache;

    大数据存储层:支持应用层和服务层的日志数据收集,关系数据库和NOSQL数据库的结构化和半结构化数据收集;

    大数据处理层:通过Mapreduce进行离线数据分析或Storm实时数据分析,并将处理后的数据存入关系型数据库。(实际使用中,离线数据和实时数据会按照业务要求进行分类处理,并存入不同的数据库中,供应用层或服务层使用)

    展开全文
  • 漫谈《大型网站技术架构》

    万次阅读 2017-04-04 20:37:14
    本文的内容来自阿里巴巴员工李智慧的著作《大型网站技术架构 核心原理与案例分析》,这本书很值得一看,故整理之。

    转载请标明出处:
    http://blog.csdn.net/forezp/article/details/69196483
    本文出自方志朋的博客

    本文的内容来自阿里巴巴员工李智慧的著作《大型网站技术架构 核心原理与案例分析》,这本书很值得一看,故整理之。

    一、大型网站的架构演化

    1.1 大型网站软件的特点

    • 高并发、大流量
    • 高可用:系统7*24小时不间断提供服务
    • 海量数据
    • 用户分布广泛
    • 安全环境恶劣
    • 需求变更快,发布频繁
    • 渐进式发展

    1.2 大型网站架构演化发展历程

    • **初始阶段的网站架构:**例如 LAMP 架构
    • **应用和数据服务分离:**三台服务器:应用服务器,文件服务器和数据库服务器
    • **使用缓存改善网站性能:**分为两种,缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器的远程缓存
    • **使用应用服务器集群改善网站并发处理能力:**通过负载均衡调度服务器来分发请求到应用服务器集群中的任何一台机器
    • 数据库读写分离: 主写从读。
    • **使用反向代理和 CDN 加速网站响应:**这两者基本原理都是缓存。反向代理部署在网站的中心机房,CDN 部署在网络提供商的机房。
    • 使用分布式文件系统和分布式数据库系统: 将不同的业务分布,将不同的业务的数据库部署在不同的机器上。
    • 使用 NoSQL 和搜索引擎: 源自互联网技术,对可伸缩的分布式有更好的支持。
    • **业务拆分:**将整个网站通过分而治之的手段将网站业务分成不同的产品线。
    • 分布式服务: 比如最近流行的微服务,横行、纵向切片,将服务集群化,相互关联化。

    在这里插入图片描述

    1.3 大型网站架构演化的价值观

    • 大型网站架构的核心价值是随网站所需灵活应对
    • 驱动大型网站技术发展的主要力量是网站的业务发展

    1.4 网站架构设计误区

    • 一味追随大公司的解决方案
    • 为了技术而技术
    • 企图用技术解决所有问题

    二、大型网站架构模式

    2.1 网站架构模式

    • 分层
    • 分割
    • 分布式
      • 分布式应用和服务
      • 分布式静态资源
      • 分布式数据和存储
      • 分布式计算
    • 集群
    • 缓存
      • Cdn
      • 反向代理
      • 本地缓存
      • 分布式缓存
    • 异步
      • 提供系统可用性
      • 加快网站响应速度
      • 消除高并发访问高峰
    • 冗余 服务器冗余运行,数据库冗余备份
    • 自动化
    • 安全 : 防止XSS攻击、sql注入

    三、大型网站核心架构要素

    • 性能
    • 可用性
    • 伸缩性 不断地向服务器集群加服务器
    • 扩张性

    四、瞬时响应:网站的高性能架构

    4.1 网站性能测试

    • 不同视角下网站的性能
      • 用户视角网站性能 响应时间
      • 开发人员视角的网站性能 响应时间、并发亮
      • 运维人员视角的网站性能 资源
    • 性能测试指标
      • 响应时间
      • 并发数
      • 吞吐量 qps tps hps
      • 性能计数器
    • 性能测试方法
      • 性能测试
      • 负载测试
      • 压力测试
      • 稳定性测试
    • 性能测试报告
    • 性能优化策略
      • 性能分析
      • 性能优化

    4.2 web前端性能优化

    • 浏览器访问优化
      • 减少http请求
      • 使用浏览器缓存
      • 启用压缩
      • css放在网页最上面 js最下面
      • 减少cookie传输
    • CDN加速。(content distribute network)
    • 反向代理

    4.3 应用服务器性能优化

    • 分布式缓存
      • 缓存的基本原理
      • 合理的使用缓存
        • 频繁修改数据
        • 没有热点的访问
        • 数据不一致与脏读
        • 缓存可用性
        • 缓存预热
        • 缓存穿透 缓存不存在,直接访问数据库
      • 分布式缓存架构
      • Memcached
    • 异步操作
    • 使用集群
    • 代码优化
      • 多线程
      • 资源复用
      • 数据结构
      • 垃圾回收

    4.4 存储性能优化

    • 机械硬盘 vs. 固态硬盘
    • B+ 树 vs. LSM 树
    • RAID vs. HDFS

    五、万无一失:网站的高可用架构

    5.1 网站可用性的度量和考核

    • 网站可行性度量
    • 网站可用性考核

    5.2 高可用的网站架构

    5.3 高可用的应用

    • 通过负载均衡进行无状态服务的失效转移
    • 应用服务器集群的session管理
      • session复制
      • session绑定
      • 利用cookie记录 session
      • session服务器

    5.4 高可用的应用

    • 分级管理
    • 超时设置
    • 异步调用
    • 服务降级 随机拒绝访问(twitter)
    • 幂等性设计

    5.5 高可用的数据

    • CAP原理
      • 数据持久性
      • 数据可访问性
      • 数据一致性
        • 数据强一致性
        • 数据用户一致性
        • 数据最终一致性
    • 数据备份
    • 失效转移
      • 失效确认
      • 访问转移
      • 数据恢复

    5.6 高可用软件质量保障

    • 网站发布
    • 自动化测试
    • 预发布验证
    • 代码控制
      • 主干开发,分支发布
      • 分支开发,主干发布
    • 自动化发布
    • 灰度发布

    5.7 网站运行监控

    • 监控数据采集
      • 用户行为日志收集
      • 服务器性能检测
      • 运行数据报告
    • 监控管理
      • 系统报警
      • 失效转移
      • 自动优雅降级

    六、永无止尽:网站的伸缩性架构

    6.1 网站伸缩性设计

    • 不同功能进行物理分离实现伸缩
    • 单一功能通过集群实现伸缩

    6.2 应用服务器集群伸缩设计

    • http重定向负载均衡
    • Dns域名解析负载均衡
    • 反向代理负载均衡
    • ip负载均衡
    • 数据链路层负载均衡
    • 负载均衡算法
      • 轮询
      • 加权轮询
      • 随机
      • 最少链接
      • 原地址散列

    6.3 分布式缓存集群的伸缩性设计

    • Memcached分布式缓存集群的访问模型
    • Memcached分布式缓存集群的伸缩性挑战
    • 分布式缓存的一致性hash算法

    6.4 数据存储服务器集群的伸缩性设计

    • 关系数据库集群的伸缩性设计
    • Nosql数据库的伸缩性设计

    七、随机应变:网站的可扩展性架构

    7.1 构建可扩展性的网站架构

    7.2 利用分布式消息队列降低系统耦合性

    • 事件驱动架构
    • 分布式消息队列

    7.3 利用分布式服务打造可复用的业务平台

    • web service与企业级分布式服务
    • 大型网站分布式服务的需求与特点
      • 负载均衡
      • 失效转移
      • 高效的远程通信
      • 整合异构系统
      • 对应用最少侵入
      • 版本控制
      • 实时监控
    • 分布式服务框架设计

    7.4 可扩展的数据结构

    7.5 利用开放平台建设网站生态圈

    • api接口
    • 协议转移
    • 安全
    • 审计
    • 路由
    • 流程

    8、固若金汤:网站的安全架构

    8.1 道高一尺魔高一丈的网站应用攻击与防御

    • xss攻击
      • 消毒
      • httponly
    • 注入攻击
      • 开源
      • 错误回显
      • 盲注
      • 消毒
      • 参数绑定
    • csrf攻击
      • 表单token
      • 验证码
      • referer check
    • 其他攻击和漏洞
      • error code
      • html注释
      • 文件上传
      • 路径遍历
    • web应用防火墙
    • 网站安全漏洞扫描

    8.2 信息加密技术及密钥安全管理

    • 单向散列加密
    • 对称加密
    • 非对称加密
    • 密钥安全管理

    8.3 信息过滤与反垃圾

    • 文本匹配
    • 分类算法
    • 黑名单

    8.4 电子商务风险控制

    • 风险
      • 账号风险
      • 买家风险
      • 卖家风险
      • 交易风险
    • 风控
      • 规则引擎
      • 统计模型


    扫码关注公众号有惊喜

    (转载本站文章请注明作者和出处 方志朋的博客

    展开全文
  • 在《实现生产者P2P&subpub兼容模式》中实现了生产者两种消息类型的兼容模式,在消费者中对于单应用同样有这样的需求,我们需要能够在一个应用内同时消费队列和发布订阅两个类型的消息。 本章概要 1、回顾; ...
    在《实现生产者P2P&subpub兼容模式》中实现了生产者两种消息类型的兼容模式,在消费者中对于单应用同样有这样的需求,我们需要能够在一个应用内同时消费队列和发布订阅两个类型的消息。

    本章概要

    1、回顾;
    2、编码;
    3、验证;

    回顾

    在springboot下,目前我们切换队列和发布订阅模式均通过spring.jms.pub-sub-domain属性配置。《实现生产者P2P&subpub兼容模式》中我们直接定了两个JmsTemplate,并通过调用setPubSubDomain(isPubSubDomain);分别设置其应用类型。同理在我们定义的DefaultJmsListenerContainerFactory中同样有
    factory.setPubSubDomain(jmsProperties.isPubSubDomain());方法对其进行设置,我们仅需定义两个不同的DefaultJmsListenerContainerFactory对应不同的setPubSubDomain设置即可满足本章的实践验证,下面开始编码验证。

    编码

    1、在JmsListenerContainerConfiguration中注册两个DefaultJmsListenerContainerFactory实例:
    @Bean(name = { "jmsListenerContainerFactory4Topic" })
    	public DefaultJmsListenerContainerFactory jmsListenerContainerFactory4Topic() {
    		DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    		factory.setConnectionFactory(cachingConnectionFactory);
    		
    		factory.setPubSubDomain(true);
    		if (this.transactionManager != null) {
    			factory.setTransactionManager(transactionManager);
    		} else {
    			factory.setSessionTransacted(Boolean.valueOf(true));
    		}
    		JmsProperties.Listener listener = jmsProperties.getListener();
    		factory.setAutoStartup(listener.isAutoStartup());
    		if (listener.getAcknowledgeMode() != null) {
    			factory.setSessionAcknowledgeMode(Integer.valueOf(listener.getAcknowledgeMode().getMode()));
    		}
    		String concurrency = listener.formatConcurrency();
    		if (concurrency != null)
    			factory.setConcurrency(concurrency);
    		return factory;
    	}
    	
    	@Bean(name = { "jmsListenerContainerFactory4Queue" })
    	public DefaultJmsListenerContainerFactory jmsListenerContainerFactory4Queue() {
    		DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    
    		factory.setConnectionFactory(cachingConnectionFactory);
    		factory.setPubSubDomain(false);
    		if (this.transactionManager != null) {
    			factory.setTransactionManager(transactionManager);
    		} else {
    			factory.setSessionTransacted(Boolean.valueOf(true));
    		}
    		JmsProperties.Listener listener = jmsProperties.getListener();
    		factory.setAutoStartup(listener.isAutoStartup());
    		if (listener.getAcknowledgeMode() != null) {
    			factory.setSessionAcknowledgeMode(Integer.valueOf(listener.getAcknowledgeMode().getMode()));
    		}
    		String concurrency = listener.formatConcurrency();
    		if (concurrency != null)
    			factory.setConcurrency(concurrency);
    
    		return factory;
    	}
    2、修改上一章节中的消费者代码,实现队列与发布定义消息的错位消费生产:
    @Component
    public class Consumer {
    	@Autowired
    	@Qualifier(value="jmsQueueMessagingTemplate")
    	private JmsMessagingTemplate jmsQueueMessagingTemplate;
    	
    	@Autowired
    	@Qualifier("consuqueue")
    	private Queue queue;
    	
    	@Autowired
    	@Qualifier(value="jmsTopicMessagingTemplate")
    	private JmsMessagingTemplate jmsTopicMessagingTemplate;
    	
    	@Autowired
    	@Qualifier(value="responsetopic")
    	private Topic topic;
    	
    	@Autowired
    	private UserRepository userRepository;
    	
    	/**
    	 * 监听queue队列消息并生产发布订阅responsetopic消息,同时生产3倍数量的用户信息;事务生效
    	 * @param text
    	 * @throws Exception
    	 */
    	@JmsListener(destination = "my.queue",containerFactory="jmsListenerContainerFactory4Queue")//ActiveMQ.DLQ
    	public void receiveQueue(String text) throws Exception {
    		System.out.println("消费者:来源于生产者的消息:"+text);
    		this.jmsTopicMessagingTemplate.convertAndSend(this.topic, "生产者辛苦生产的发布订阅消息成果");
    		System.out.println("生产者2:辛苦生产发布订阅消息成果");
    		List<User> list=new ArrayList<User>(10);
    		list.add(new User("111","111"));
    		list.add(new User("12211","222"));
    		list.add(new User("333","333"));
    		for(User user:list){
    			userRepository.save(user);
    		}
    //		throw new Exception("出现异常啦");
    	}
    
    	/**
    	 * 监听topic发布订阅消息并生产consuqueue队列消息,同时生产3倍数量的用户信息;事务生效
    	 * @param text
    	 * @throws Exception
    	 */
    	@JmsListener(destination = "my.topic",containerFactory="jmsListenerContainerFactory4Topic")//ActiveMQ.DLQ
    	public void receiveTopic(String text) throws Exception {
    		System.out.println("消费者:来源于生产者2的消息:"+text);
    		this.jmsQueueMessagingTemplate.convertAndSend(this.queue, "生产者辛苦生产的点对点消息成果");
    		System.out.println("生产者2:辛苦生产的点对点消息成果");
    		List<User> list=new ArrayList<User>(10);
    		list.add(new User("111","111"));
    		list.add(new User("12211","222"));
    		list.add(new User("333","333"));
    		for(User user:list){
    			userRepository.save(user);
    		}
    //		throw new Exception("出现异常啦");
    	}
    	
    }

    验证

    1、首先查看目前的数据信息
    用户数据

    队列消息

    消息表

    暂时没有发布订阅消息。

    2、预期:
    2.1、每消费一个queue会生产一个responsetopic消息,故MQ控制台应该是4个responsetopic消息、12个用户数据;
    2.2、每消费一个topic消息会生产一个consuqueue消息,故启动topic消息生产者后查看其控制台具体生产数量,在MQ控制台是否生产了对应数量的consuqueue消息、以及3倍数量的用户数据;

    3、启动消费者监听:
    发布订阅消息部分

    队列消息部分

    数据库用户:原来24+消费4个topic*3+消费4个queue*3=48

    数据库消息表:


    总结:通过自定义不同类型应用的DefaultJmsListenerContainerFactory实例实现了单应用内同时消费队列和发布订阅两个类型消息,并且每个监听内部仍然满足分布式事务约束。我们也看到了消息表中没有被消费的发布订阅消息并不存在,那是由于没有持久化的订阅者,故后面章节将实现持久化订阅者。


    展开全文
  • 亚马逊云科技发布全新 Amazon Elastic Block Store 低成本 HDD 存储选项 全新块存储选项以最低成本向流传输和大数据工作负载交付始终一致的性能
  • 此外,Tor的目标是让所有用户看起来一样,因此Tor浏览器难以根据用户的浏览器和设备信息进行指纹识别。但在移动端使用Tor浏览器安卓版本,用户可以自由访问本地互联网服务提供商可能已阻止的网站。 用户可以从...
  • 大型网站架构之架构模式

    万次阅读 2020-05-22 13:14:53
    上节讲了大型网站的演变,今天讲下架构的模式,什么是模式呢?每一个模式描述了一个再我们周围不断重复发生的问题及问题解决方案的核心,这样你就能一次次重用该方案而不必去做重复的工作,可见模式的关键在于可重复...
  • 大型网站技术架构

    万次阅读 2016-11-28 11:22:28
    第一篇:概述传统的企业应用系统主要面对的技术挑战是处理复杂凌乱、千变万化的所谓业务逻辑,而大型网站主要面对的技术挑战是处理超大量的用户访问和海量的数据处理;前者的挑战来自功能性需求,后者的挑战来自非...
  • 今天讲讲这最后一个:安全性,从互联网诞生开始,安全威胁就一直伴随着网站的发展,各种web攻击和信息泄露也从未停止,那么我们今天就从下面这几点谈谈网站架构的安全性:网站应用与防御、信息加密及秘钥安全管理、...
  • 一、网站应用背景开发一个网站的应用程序,当用户规模比较小的时候,使用简单的:一台应用服务器+一台数据库服务器+一台文件服务器,这样的话完全可以解决一部分问题,也可以通过堆硬件的方式来提高网站应用的访问...
  • 大型网站技术架构 笔记

    千次阅读 2014-07-24 15:34:24
    大型网站架构演化 特点: 高并发、大流量 高可用 海量数据 用户分布广泛、网络情况复杂 安全环境恶劣 需求快速变更、发布频繁 渐进式开发 演化发展历程 1. 初始阶段: 应用程序、数据库、文件都在一台服务器,如常用...
  • 为什么要发布紧凑瓦片,而不老老实实用PNG? 下面是废话,想看技术直接跳到正文部分。 起初博主在查阅了GeoWebCache(version 1.8) Serving Layers From Pre-Cached ArcGIS Tiling Schemes (别问我为什么看的...
  • 大型网站架构之核心要素

    万次阅读 2020-05-23 22:22:14
    应用服务器上不能保存会话信息,否则服务器宕机,会话丢失,即使请求转发到别的服务器但是拿不到会话信息,还是无法完成业务处理); 存储:数据存储在多台服务器上,相互之间进行实时备份,当任何一台服务器宕机时...
  • 基于Java技术的大型网站架构设计方案 笑游江湖 发表于 2014-03-16 16:56:00 | 分类标签: 网站架构 JAVA 高并发 1、Web层 主体架构可以基于 Struts 1.X/2.X,当然有很多更好的控制层框架供选择,以快速敏捷为...
  • 大型网站架构演化(总)

    千次阅读 2017-03-18 13:29:53
    如果把上世纪90年代初CERN正式发布WEB标准和第一个WEB服务的出现当做互联网站的开始,那么互联网站的发展只经历了短短20多年的时间。在20多年的时间里,互联网的师姐发生了巨大变化,今天,全球有近一半的人口使用...
  • 大型网站数据库优化千万人同时访问的网站,一般是有很多个数据库同时工作,说明白一点就是数据库集群和并发控制,这样的网站实时性也是相对的。这些网站都有一些共同的特点:数据量大,在线人数多,并发请求多,...
  • 大型网站电商网站架构案例和技术架构的示例

    万次阅读 多人点赞 2016-03-04 10:20:13
    1.大型网站电商网站架构案例 大型网站架构是一个系列文档,欢迎大家关注。本次分享主题:电商网站架构案例。从电商网站的需求,到单机架构,逐步演变为常用的,可供参考的分布式架构的原型。除具备功能需求外,还...
  • 阿里创作平台内容号怎么发布信息

    千次阅读 2017-10-26 09:37:06
    最近不少网友跟小编咨询阿里创作平台的相关事宜,那么今天小编要给大家讲述的内容是阿里创作平台内容号怎么发布信息?阿里创作平台帖子怎么发?阿里创作平台怎么推广?如果大家要想了解更多的详细内容的话,那就请大家...
  • 历时数月,RDIFramework.NET V2.8版本发布了,感谢大家的支持。  RDIFramework.NET,基于.NET的快速信息化系统开发、整合框架,为企业或个人在.NET环境下快速开发系统提供了强大的支持,开发人员不需要开发系统的...
  • 大型电商网站架构案例和技术架构【推荐】

    万次阅读 多人点赞 2018-05-17 10:14:24
    大型网站架构是一个系列文档,欢迎大家关注。本次分享主题:电商网站架构案例。...本次分享大纲电商案例的原因电商网站需求网站初级架构系统容量估算网站架构分析网站架构优化架构总结电商网站案...
  • 作者:疯狂代码 来源:http://www.crazycoder.cn  大型网站架构系列之一 不得不... 注意:这里的大型网站架构只包括高互动性高交互性的数据大型网站,基于大家众所周知的原因,我们就不谈新闻类和一些依靠HTML静
  • 网站架构技术的核心架构要素  本部分是本书的重点,涉及书中第3章到第8章6个章节的内容,占了全书内容的大半篇幅。其中第三章是后面五章的概述和总结,而第四到第八章则分别介绍了性能、可用性、伸缩性、扩展性和...
  • 说说大型高并发高负载网站的系统架构

    千次阅读 热门讨论 2010-08-06 14:40:00
    发布:倪海涛 来自:BudiChina.com 更新:2010-03-15 11:53:58 转帖:http://www.toplee.com/blog/71.html 摘要:一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了。随着互联网业务的不断丰富,...
  • OpenJWeb(v1.9) 企业级信息化应用平台开源版发布公告(基于Java语言开发) 最近不少软件公司、生产企业、程序员对openjweb快速开发平台表示了极大关注,为了推动中国开源事业的发展,推动企业信息化应用的标准化...
  • 关系数据库的发展历史

    千次阅读 2019-03-12 23:15:03
    信息系统产生了海量的数据,有数据必须要有数据的存放位置, 无库时代 :没有专门的数据库,数据大多以文件形式存放 层次状数据库 :使用层次状模型进行数据库设计和存放 网状数据库 :使用网状模型进行数据库...
  • 金山发布《2006年度信息安全报告》

    千次阅读 2007-02-09 22:37:00
    2007年2月8日,金山软件正式发布了《中国互联网2006年度信息安全报告》,该报告中的数据由金山毒霸全球反病毒监测中心、金山毒霸全球病毒应急处理中心、金山毒霸客户服务中心联合监测得出。   据报告显示, 2006...
  • 互联网产品灰度发布

    万次阅读 2016-05-30 14:37:39
    互联网产品灰度发布   关于2016年5月15日,DevOps成都站|架构与运维峰会活动总结 1. 前言 2 2. 灰度发布定义 5 3. 灰度发布作用 5 4. 灰度发布步骤 5 5. 灰度发布测试方法 6 6. 灰度发布引擎 6 7. 灰度...
  • 说说大型高并发高负载网站的系统架构转载本文请著名出处:Just Do IT (http://www.toplee.com) lee@toplee....同时自己接触和开发过不少大中型网站的模块,因此在大型网站应对高负载和并发的解决方案上有一些积累和经验
  • 一个功能强大的分类信息(广告)系统,网软志成分类信息网正式版下载,地方门户系统,分类信息网模板,分类信息网淡红色风格版下载,仿快点8分类信息网门户网站系统源码,供求信息发布网站系统和信息发布网站程序,漂亮的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 312,014
精华内容 124,805
关键字:

信息发布型网站