后台系统可扩展性学习笔记(十四)异步机制与MQ

对于 Web 服务而言,提升可扩展性的主要途径是将耗时的同步工作改成异步处理,从而允许将这些工作“外包”给多个 Worker 去做,或者提前完成能够预知的部分。
异步机制与可扩展性之间的关系需要从(异步)并行处理的优势说起。

串行、并发与并行

可扩展性,意味着能通过向系统添加资源的方式应对不断增加的工作量。
对于多个任务,一般有 3 种执行策略:

  • 串行:一个接一个地同步执行,总耗时为所有任务之和
  • 并发:多 CPU/多核并发执行,总耗时取决于最慢的任务耗时
  • 并行:异步并行执行,总耗时同样取决于最慢的任务耗时

异步的意义

除了可扩展性方面的优势外,异步更多的意义在于:

  • 可打断/可暂停:允许分片执行,而不必一次做完
  • 可调度:允许更细粒度的时间管理,比如闲时主动执行、甚至离线执行
  • 并行的可能性:异步返回结果,意味着任务可以交给其他worker执行
  • 解耦生产者和消费者:把worker分离出去,使之能够独立扩展,比如只加worker而不加web server

消息队列

实现上,最常见的异步机制当然是消息队列:由消息队列提供异步通信协议,消息的发送方和接收方不需要同时与消息队列进行交互。
例如,邮件系统中,发件人将邮件发出之后,可以继续处理其他内容,而无需等待收件人响应。在用户看来,任务是立即完成的,但实际上是在一段时间之后才真正完成(所谓异步)。
消息队列的运作中有 3 个角色,消息的生产者消费者以及经纪人(Broker):

  • 生产者:应用程序往队列里发布任务后,立即告知用户该任务的状态
  • 消费者:worker拿到任务并执行,完成之后通知
  • Broker:从队列里取出任务并分发给worker,并负责管理任务的完整性,包括失败重试、(根据worker的实际状态)动态调整分发策略

消息队列还得考虑下面的一些问题:

  • 消息可能会丢失,比如消费者挂了、消息队列挂了
  • 消息可能会重发多次,比如消费者消费完忘记发送ack了
  • 可能会出现忙闲不均的情况,比如轮流分发的话,有些worker接到的总是重活儿
  • 队列可能溢出,比如worker太少或太忙,导致消息迅速堆积

更多的关于MQ的设计的方面的可以参考一下以前的笔记:
消息队列重要机制讲解以及MQ设计思路

漏斗模型

消息队列就像一个漏斗,用来控制流量和流速:
在这里插入图片描述
汹涌而至的消息从敞口流入,经过缩口以固定的流速输出给(消息的)消费者:
如果生产速率始终低于消费速率,倒进来立即就流走了,那么就不需要漏斗(消息队列)。
如果生产速率始终大于消费速率,就会在漏斗中累积,最终填满、溢出,导致消息丢失:

这种现象称为Back pressure(反向压力),下游消费速度限制了传输,此时可以限制队列大小,排满了就返回 503,稍后重试(比如采取指数退避策略,让重试间隔越来越长)。所以,只有生产速率在短期内大于(而不是始终大于)消费速率的情况下,漏斗才有意义——用来吸收暂时的超量生产量。

利特尔法则

队列中的消息实际上等同于在排队。
排队理论中一个有名的定理叫利特尔法则:

L = λWL: average number of items in the queuing system(排队系统中的平均项目数)
W: average waiting time in the system for an item(项目在系统中的平均等待时间)
A: average number of items arriving per unit time(单位时间内到达的平均项目数)

适用于任何稳定运转的排队系统:
“排队系统”由离散对象组成,我们称之为“物品”,它们以某种速率“到达”到“系统”在系统中,这些项目可能会形成一个或多个队列,最终接收“服务”并退出。
“稳定运转”,是指不包括系统启动、退出等过渡状态.
"物品”经过的状态:到达 -> 排队 -> 离开。
L = λW就是说:
队伍的平均长度 = 平均到达速度 * (每一项的)平均等待时间
例如:

酒窖:偶尔买一瓶放进去,平均每个月买 8 瓶,朋友聚会时候喝掉一些,但多数时候窖里都有 160 瓶,那么,就可以知道取出来喝的时候,每瓶酒在酒窖里平均存放了 1.67 年(W = 160 / (8 * 12)),离陈酿还有一段距离

邮箱:平均每天收到 50 封新邮件,邮箱里多数时候有 150 封未读邮件,那么平均每 3 天(W = 150 / 50)处理一封邮件,可以作为邮件处理效率的衡量标准

工厂:每天平均加工 1000 份原材料,在制品(WIP, work-in-process)数量平均有 45000 个,那么每件产品的加工周期是 45 天(W = 45000 / 1000),周期比较长

医院:某地区平均每天诞生 5 名新生儿,待产妈妈平均会在产房待 2.5 天,那么,产房通常住有 12.5 位(L = 5 * 2.5)待产妈妈,也就是说,产房床位不能少于 13 张,对应的医护人员也不能太少

三项中,只要知道两个(易知的)就能粗略得出另一个(难算的),这就是利特尔法则的意义。

参考

http://www.ayqy.net/blog/asynchronism/

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

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

相关文章

RegisterClientScriptBlock与 RegisterStartupScript区别

Page.ClientScript.RegisterClientScriptBlock而用Page.ClientScript.RegisterStartupScript是因为:RegisterStartupScript 把script放置在ASP.NET page的底部,而RegisterClientScriptBlock把script放置在ASP.NET page的顶部,用RegisterClien…

【Web后端笔记】SQL Server与java数据类型对应

编号数据库类型JDBC类型JDBC索引描述1intjava.lang.Integer4 2varcharjava.lang.String12 3charjava.lang.String1 4ncharjava.lang.String1 5nvarcharjava.lang.String12 6textjava.lang.String-1 7ntextjava.lang.String-1 8tinyintjava.lang.Integer-6 9intjava.lang.Intege…

后台系统可扩展性学习笔记

整理了一下笔记目录,将以前学习的一些知识串联起来了,比如cdn、负载均衡、中间件,以前只是各自了解了一点,现在大概理清了后台系统设计中他们各自的作用。 后台系统可扩展性学习笔记(一)概要 后台系统可扩展…

TFS 强制删除锁定文件(数据库)

TFS:TFS2010 VS:VS2012 OS:Windows2008 DB:Sqlserver2008 R2 我们在团队开发当中,版本控制是一个不可忽略的工具。我们团队使用的是TFS2010这个版本控制器。 但在团队实际协作开发当中,团队成员难免有电脑损坏或人员离职情况&…

【转】Java:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: [java]view plaincopy /** The value is used for character storage. */ private final char value[]…

Linux中exit与_exit的区别

在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出&…

光标闪烁问题的解决办法

在调用Windows API函数SetCursor设置光标时,可能会碰到闪烁的问题:移动鼠标,光标在Class Cursor(即注册窗口类时指定的Cursor)与预设Cursor之间闪烁。 在MSDN上有关SetCursor函数的备注中强调,如果Class Cursor非空,那…

视频编解码基础

文章目录前戏编解码技术流程主流视频编码标准视频传输面临的问题视频传输差错控制视频传输Qos质量保证参数人类视觉系统HVS 以及相应编码措施正餐编码层次与码流结构PB帧编码IBBP序列编码结构图像编码结构条带编码结构宏块编码结构块编码结构预测技术码率控制实例H264前戏 编解…

XShell 屏幕锁定的恢复方法(Ctrl+Q)

操作XShell过程中很多时间大家会习惯性的按CtrlS进行保存. CtrlS在XShell的作用是屏幕锁定,很多朋友会无法操作,会直接把窗口关闭。 解决方法: 快捷键 CtrlQ 即能完成解锁!转载于:https://www.cnblogs.com/liangle/p/3173475.html

adb端口被占用

程序不能执行,kill掉任务管理器里面adb服务,重新连接设备仍然有错 查到可能是adb端口被占用 查看adb用的是哪个端口:C:\Users\wanglin>adb nodaemon server 查看谁占用了这个端口:C:\Users\wanglin>netstat -ano | findstr …

实时语音通讯丢包补偿技术

文章目录基于发送端丢包补偿技术原理与媒体无关的前向差错纠正媒体相关前向差错纠正交织技术基于接受端丢包补偿技术基于插入方法基于插值方法基于重构的方法应用建议非交互式交互式拓展阅读参考丢包补偿技术可以分为两类:基于发送端补偿、基于接受端补偿 基于发送…

取得裝置可以顯示頁面的寬度

利用html中的div元素取得<div id"divGetWidth" width100%></div>Jquery:var width$(#divGetWidth).width(); //获取元素宽度 Javascript:var objdocument.getElementById(divGetWidth);var width obj.offsetWidth转载于:https://www.cnblogs.…

Xcode添加静态库以及编译选项配置常见问题

本文转载至 http://www.cnblogs.com/Quains/archive/2013/08/22/3276425.html 一,Xcode编译出现Link错误,出现"duplicate symbols for architecture i386 clang"提示.问题:链接时,项目有重名文件.解决:根据错误提示,做如下检查:1.Taraget->Build Settings->Li…

关于并发概念的一些笔记

目录1、基于锁的并发数据结构1、并发计数器2、懒惰计数器3、并发链表4、并发队列5、并发散列表总结2、条件变量使用&#xff08;POSIX&#xff09;生产者/消费者 &#xff08;有界缓冲区问题&#xff09;覆盖条件扩展3、信号量使用二值信号量&#xff08;锁&#xff09;0值信号…

MYSQL常见出错代码 mysql error number

1016错误&#xff1a;文件无法打开&#xff0c;使用后台修复或者使用phpmyadmin进行修复。1044错误&#xff1a;数据库用户权限不足&#xff0c;请联系空间商解决1045错误&#xff1a;数据库服务器/数据库用户名/数据库名/数据库密码错误&#xff0c;请联系空间商检查帐户。105…

建立apk定时自动打包系统第三篇——代码自动更新、APP自动打包系统

我们的思路是每天下班后团队各成员在指定的时间&#xff08;例如下午18:30&#xff09;之前把各自的代码上传到SVN&#xff0c;然后服务器在指定的时间&#xff08;例如下午18:30&#xff09;更新代码、执行ant 打包命令、最后将apk包存放在指定目录&#xff08;或者上传指定ft…

对于线程并发模型与事件并发模型的思考

这里将以对话的形式进行&#xff1a; A&#xff1a; 普通的线程是可以被其他线程中断掉的&#xff0c;而基于select、epoll的事件处理函数实际上是不可以被其他事件&#xff08;线程&#xff09;中断的。 我这个理解对吗&#xff1f; B&#xff1a; 图片里的应该是对是否…

Cache 总结

这一文&#xff0c;让我们分析一下&#xff0c;《浅谈 Cache》 一文中的奇怪现象&#xff0c;事实上如今来看也并不奇怪了。在什么情况下 r1 和 r2 都为 0 呢&#xff1f;细致看代码&#xff0c;你会发现&#xff0c;两个线程分别被执行在不同的 CPU 核上&#xff0c;而且在线程…

c/c++常见类型转换错误

文章目录char转int 高位符号扩展有符号int与无符号int比较关于一个bit的位域变量的取值范围临时变量溢出size_t死循环char转int 高位符号扩展 int main() {char a 0x9A;int util;util (int)a;cout << a << endl;cout << util << endl;if (util >…

Javascript 装载和执行

一两个月前在淘宝内网里看到一个优化Javascript代码的竞赛&#xff0c;发现有不少的人对Javascript的执行和装载的基础并不懂&#xff0c;所以&#xff0c;从那天起我就想写一篇文章&#xff0c;但一直耽搁了。 首先&#xff0c;我想说一下Javascript的装载和执行。通常来说&am…