我也要谈谈大型网站架构之系列(4)——分布式中的异步通信

 

  我们知道在面向对象编程中,总会想着各种办法来实现代码的解耦,从而让项目中的各种人员面对自己熟悉的业务进行开发,

做到术业有专攻,比如大家非常熟悉的三层架构,MVC,MVP以及MVVM模式,让前端设计专注于html的制作,让后端开发人员

更加专注于业务逻辑的编写,可以看到,我们这么做的目的就是想最大程度的做到系统的可扩展和可维护性,那么我们的大型网站

是不是也要遵守这种模式呢?

 

一:分层和分割

1:分层

    对于分层,我们可能非常熟知了,数据访问层,业务逻辑层,缓存层,应用层,层层专注于自己的业务,然后根据需要建立起

 各自的集群,各自分离部署,而从达到系统的扩展性和维护性。

 

2:分割

    如果说前面是横向切割,那分割就是纵向切割,我们可以把网站的整体业务切分成很多的小业务,比如博客园的导航栏,我们都

可以认为是一个独立的网站,配上各自的二级域名,建立各自的集群来实现系统的扩展性,当然这个粒度可大可小。

如果说这些子网站不存在相互调用,那么我们新增模块或者修改模块基本上都不会对其他模块造成影响,这也是我们做扩展性的终极

目标,现在既然都做到解耦了,下面的目标就是做如何通信了,通信可以分为“同步”和“异步”,这篇主要是讨论下异步操作,在分布式

系统中做到"异步操作“,当然少不了强大的消息队列。

 

二:消息队列

    在分布式的系统中使用消息队列后,我们的生产者只管向消息队列中甩完数据后立即返回,而不管是哪个消费者来消费,可以看到

其实消息队列有如下三个优点。

 

1.  加快网站的相应速度

    这个刚才也说了,应用层直接把消息给消息队列然后直接返回调用端,这样就避免了处理复杂的业务逻辑然后同步的插入到数据

  库后再返回造成的响应延迟,在很多网站上用户提交订单就是这么处理的,应用层生成一个订单号之后,将订单丢给消息队列,然后

  直接到订单成功页面,此时后端消费者对订单还没有处理完毕,因为后面会有比较多的数据操作,比如减库存,数据库同步等等,而

  用户如果想要看到订单详情,需要点击“订单号”才能进入到订单详情页,这种处理也是因为消息队列的非及时性,所以需要得到网站

  设计方改进和支持

 

2. 提供系统的可用性

    既然是异步操作,就造成了生产者不知道消费者的存在,而反过来消费者不知道生产者的存在,如果消费者挂了就不会影响到生产者,

  生产者还会照常无误的向消息队列甩消息,当消费者恢复正常后就会继续消费消息队列,系统的表现可能就是email或者短信延迟收到,

  不会对系统造成太大的影响。

 

3. 并发削峰

   既然是大型网站就免不了高并发的读写操作,很典型的一个例子就是电商中的秒杀,这种高并发的写操作,如果一下子都涌入到数据库

里面去了,会导致数据库的压力非常大,从而导致客户端的访问延迟,就是不挂也容易造成数据库的死锁从而造成很多灵异事件,遇到这

种一拥而入的情况,我们就必须进行线性化操作,在代码层面上我们可以用lock机制来串行化,在分布式中我们用“消息队列”来串行化,

而且还可以通过逻辑操作来对消息队列进行动态的防洪,控洪。

 

 在消息队列的选择上,微软有自己的MSMQ,但是在大型网站中,我们的消息队列同样需要集群,并且希望能跑在内存中,并且支持序列

化硬盘,同时在“伸缩性”和“可靠性”上要有好的作为,所以推荐大家用用开源的RabbitMQ,网址:http://www.rabbitmq.com/  不过很

多公司都有自己开发的消息队列,比如携程的CMessage,淘宝的MetaQ。

 

 

转载于:https://www.cnblogs.com/huangxincheng/p/3715293.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node模块函数图解

已截图方式记录模块信息: HTTP模块: 对于网络返回处理状态封装了很多种,我已截图展现 以上状态也是在http协议中包含的状态。 http函数: path模块: 转载于:https://www.cnblogs.com/kuailingmin/p/4547538.html

android 心跳效果动画,Android实现心跳的效果

最近再做一个教育类的项目。在做一些学习工具的时候,美工提出了一些要求,大致如下:其实实现过程也不难,大致就是对一个视图控件添加一个圆形的背景,然后该视图进行动画处理,膨胀的同时,透明度增…

Oracle超出最大连接数问题及解决

用过Oracle的应该都熟悉如何查看和设置Oracle数据库的最大连接数。这里就再啰嗦一遍。 查看当前的连接数,可以用select count(*) from v$process;设置的最大连接数(默认值为150)select value from v$parameter where name ‘processes’;修改…

操作系统上机作业--使用系统调用实现mycat

mycat.c的功能与系统cat程序相同mycat将指定的文件内容输出到屏幕,例子如下:要求使用系统调用open/read/write/close实现 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/u…

GCDAynscSocket简单使用-客户端

这是一篇介绍GCDAynscSocket客户端简单使用的文章(服务端后续添加) 背景:在这篇文章之前我对socket的了解仅限于知道有TCP、UDP两种方式,使用抓包工具时甚至看不懂抓包数据(惭愧...),所以本文介…

微信android版字体,微信炫彩字下载-微信七彩字体 安卓版v1.6.2-PC6安卓网

微信七彩字体一款方便的手机字体更换软件,微信炫彩字软件集合了上百款优质中文美化字体,微信七彩发光字里有可爱的喵呜体、卡通体,清秀的静蕾体等多种字体。软件介绍微信、qq上最好用、最个性的聊天字体应用,让你的聊天与众不同&a…

Android SQLite 数据库 增删改查操作

Android SQLite 数据库 增删改查操作 转载▼一、使用嵌入式关系型SQLite数据库存储数据在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象…

SIT与UAT的分别

在企业级软件的测试过程中,经常会划分为三个阶段——单元测试,SIT和UAT,如果开发人员足够,通常还会在SIT之前引入代码审查机制(Code Review)来保证软件符合客户需求且流程正确。下面简单介绍一下SIT和UAT的…

操作系统上机作业--使用系统调用实现mycp

mycp.c的功能与系统cp程序相同将源文件复制到目标文件,例子如下:要求使用系统调用open/read/write/close实现 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nolo…

android自动化持续集成,基于持续集成的Android自动化测试.pdf

基于持续集成的Android自动化测试.pdf2015 年 第24 卷 第 5 期 计 算 机 系 统 应 用①基于持续集成的Android 自动化测试王 焱, 张 征(华中科技大学 自动化学院, 武汉 430074)摘 要: Android 测试方面的研究大多集中在测试工具和框架的实现上, 有些工具和框架可以实现测试用例…

Csharp 高级编程 C7.1.2

第七章 代理(1) 一、代理要声明 二、代理使用步骤 声明代理初始化代理(使用 实例的方法名 作为参数)使用代理代码示例: /*C7.1.2*/ using System; using System.Collections.Generic; using System.Linq; using System…

操作系统上机作业--实现mysys(多进程)

mysys.c: 实现函数mysys&#xff0c;用于执行一个系统命令&#xff0c;要求如下mysys的功能与系统函数system相同&#xff0c;要求用进程管理相关系统调用自己实现一遍使用fork/exec/wait系统调用实现mysys不能通过调用系统函数system实现mysys 测试程序 #include <stdio.…

06链队列_LinkQueue--(栈与队列)

#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ty…

android 透明变成白色,android – 状态栏不透明但是白色

为了用anko DSL测试kotlin我决定在最后一个android studio ide(2.1.3)中使用kotlin插件(1.0.3)和最新的anko库(0.9)开始一个新的proyect我使用默认的proyect Navigation Drawer Activity,所以我只需要将主xml转换为anko.这是xml&#xff1a;xmlns:android"http://schemas.…

操作系统上机作业--实现shell(1)(多进程)

sh1.c: 实现shell程序&#xff0c;要求具备如下功能支持命令参数 $ echo arg1 arg2 arg3 $ ls /bin /usr/bin /home 实现内置命令cd、pwd、exit $ cd /bin $ pwd /bin 实现思路&#xff1a;在获取命令字符串后&#xff0c;用strtok函数对字符串进行处理&#xff0c;获取参数…

VC下勉强可用的list

linux内核中的list太好用了&#xff0c;可惜VC编译器不支持 typeof 关键字&#xff0c;将linux内核中的list直接移植过来不能用 修改所有与typeof相关的代码后&#xff0c;终于可以勉强在VC下运行起来了&#xff0c;但是还不完美&#xff0c;list_for_each_entry和list_for_eac…

当执行游戏0xc000007b错误的解决方法

如图&#xff0c;这个错误使无数玩家烦恼。 出现这个错误&#xff0c;可能是硬件的问题&#xff0c;也可能是软件的问题。可是&#xff0c;因为硬件引起该问题的概率非常小&#xff0c;而且除了更换硬件之外没有更好的解决方法&#xff0c;因此本文将具体介绍怎样通过软件解决此…

android触屏音文件地址,Android音视频-音频采集

Android的音视频开发是我暂定的一个职业发展的一个方向&#xff0c;通过自学记录一些记了又忘记的知识。音频基础知识采样率(samplerate)蓝色代表模拟音频信号&#xff0c;红色的点代表采样得到的量化数值。采用就是把模拟信号数字化的过程&#xff0c;不仅仅是音频需要采样&am…

平衡二叉树,AVL树之图解篇

学习过了二叉查找树&#xff0c;想必大家有遇到一个问题。例如&#xff0c;将一个数组{1,2,3,4}依次插入树的时候&#xff0c;形成了图1的情况。有建立树与没建立树对于数据的增删查改已经没有了任何帮助&#xff0c;反而增添了维护的成本。而只有建立的树如图2&#xff0c;才能…

窗体

GDI:图形设备接口 所有能够将电子信号转换成图像显示的设备是图形设备&#xff0c; 常见的图形设备有显示器&#xff0c;打印机。 Winform封装了GDI底层的接口&#xff0c;提供一组面向对象的接口&#xff0c;供我们使用 Partial关键字&#xff0c;用他修饰的类叫分布类/部分类…