后台系统可扩展性学习笔记(十四)异步机制与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,一经查实,立即删除!

相关文章

光标闪烁问题的解决办法

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

视频编解码基础

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

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

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

关于并发概念的一些笔记

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

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

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

Ubuntu 14.10 -- 异次元软件世界

Ubuntu 14.10 中文桌面版/服务器正式版下载 - 华丽免费易于入门的 Linux 操作系统 [ 系统工具 - Linux // 2014-10-25 ]一说到 Linux,就不得不提目前最红火的 Ubuntu 发行版了!它拥有绚丽的界面,甚至跟以时尚为卖点的 Mac OSX 相比也有过之而…

System Design笔记:在线售票系统设计

文章目录何为在线售票系统?系统目标和要求1、功能要求2、非功能性需求3、设计注意事项4、容量估算5、系统API1.SearchMovies2.ReserveSeats6、数据库设计7、高级设计8、细节模块设计9、流程服务器如何跟踪所有尚未预订的active预订?服务器如何跟踪所有等…

流媒体协议初探(MPEG2-TS、RTSP、RTP、RTCP、SDP、RTMP、HLS、HDS、HSS、MPEG-DASH)

目录一、综述需求分析协议定制二、MPEG2-TS协议三、RTSP协议、RTP、RTCP、SDPRTSPRTP、RTCP、SDP四、RTMP五、HLS、HDS、HSSHLSHDS和HSS六、MPEG-DASH协议具体内容应用七、流媒体服务器流媒体服务器的功能与挑战客户端支持协议支持应用场景应用特点扩展技术广告投放录屏其他一、…

eclipse偶尔会反映迟钝,直接无视其报错

比如,你在web.xml中配置了什么东西,在有的时候不一定就会立即被eclipse察觉到,即便你的配置正确了,甚至重启了几次服务器,它仍然给你报错 比如说,刚才我在web.xml中配置了一个taglib,并且tld文件…

Qos(Quality of Service)

QOS(即Quality of Service,服务质量)主要指网络环境下服务满足用户的程度,在视频服务的语境下也可认为是Quality of Streaming,即流媒体服务的质量。通常,QOS可以由一系列指标表达,如传输的速度…

Popline:帅气的浮动 HTML5 文本编辑器工具栏

Popline 是一个基于 HTML5 实现的富文本编辑器工具栏,设计灵感来自 PopClip ,相比传统的文本编辑器工具,Popline 能够浮动在编辑的文本周围,操作起来十分方便。 您可能感兴趣的相关文章Metronic – 基于 Bootstrap 响应式后台管理…

流媒体技术优化

文章目录1、下载策略优化CDN选择策略错误处理策略码率选择策略2、协议和架构优化HTTP2TCP变种拥塞控制QUIC架构流媒体协议的选择与分发体系架构的设计对优化起着关键作用。 HLS和DASH协议在点播和OTT直播服务中已逐渐占据主流,其思想主要是将视频转为不同码率并切为…

API设计笔记:pimpl技巧

pimpl pointer to implementation:指向实现的指针,使用该技巧可以避免在头文件暴露私有细节,可以促进API接口和实现保持完全分离。 Pimpl可以将类的数据成员定义为指向某个已经声明过的类型的指针,这里的类型仅仅作为名字引入&am…

《设计模式》-责任链模式

责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的用而链起来形成一条链,请求在这个链上传递,直到链上的某一个对象决定处理此请求。 发出请求的客户端并不知道链上的哪一个对象终处理这个请求&#…

【机器学习】EM最大期望算法

EM, ExpectationMaximization Algorithm, 期望最大化算法。一种迭代算法,用于含有隐变量(hidden variable)的概率参数模型的最大似然估计或极大后验概率估计,其概率模型依赖于无法观测的隐变量。 经常用在ML与计算机视觉的数据聚类领域。 EM应用&#xf…

做一个给自己手机免费发送“天气预报”信息的软件

实现一个以下截图这样的功能!没错,就是你手机可以收到“免费”的天气预报短信! 一、在做之前必须了解以下四个功能: 1、WebService 2、Quartz.Net(定时任务框架) 3、SMTP:简单邮件传输协议,它是…

Android_Chronometer计时器

最近做一个项目用到Handler 和Message ,开始时不是很明白,不了解其中的内部机制,所以开发起来有点难度,之后自己找了Android 时间服务 这一节的内容,总结了一点关于时间的知识,在这里大概写一下&#xff0c…

置顶 | wolai博客

最近用wolai记录笔记较多,这里放一下我wolai的地址,当然csdn这边也会同时更文。 hanhan的博客

为你的程序添加监听器

平时在写程序时经常会遇到监听器,比如按钮的click监听器,按键监听器等等。而android中的监听器和java中的回调函数是同一个概念,都是在底层代码中定义一个接口来调用高层的代码。那么什么是回调函数呢?网上说的是“在WINDOWS中&am…

Git push 时每次都需要密码的疑惑

2015.1.13更新: 在本地搭建Git服务器时,也是有每次操作需要密码的情况。 是因为每次做推送动作时,Git需要认证你是好人。所以需要密码。 可以在 /home/username/.ssh/authorized_keys 文件里添加你的 ssh 公钥。一行一个。这样就可以在你push…