如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题。

  最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面。在执行此类阻塞操作时,消息会不受限制地堆积在消息队列中。 一个更为糟糕的例子是我曾经为lhttpc库的某个分支写的http连接池管理器。在大多数测试用例下,它都工作正常,我们甚至把连接的超时时间设置为10ms,以确保不会耗费太多的时间40。正常工作了几周后,该HTTP连接池导致了一次服务中断,原因是有个远程服务器down机了。 这次恶化背后的原因是:当远程服务器down机后,突然之间,所有的连接操作都至少要耗费10ms的时间,也就是连接超时时间。每秒大约有9,000个消息发给中心进程,通常每个消息的处理时间在5ms之内,这个超时的影响等同于每秒18,000个消息,情况变得失控。 我们的解决方案是,把进行HTTP连接的任务放到调用进程中,并加以限制,感觉仍像是管理器自己在做这件事一样。现在,阻塞操作分布到库的所有使用者之中,管理器要做的工作更少了,可以接受更多的请求。
  当程序中有任何一个点,最终成为接收消息的中心点时,耗时的任务要尽可能从中移出。对于可以预见的过载41,增加更多的进程(它们或者处理阻塞的操作,或者在主进程阻塞时充当缓冲)往往是个不错的方法。 如果某些活动并没有内在的并发要求,那么这种方法会增加进程管理方面的复杂性,所以在这样做之前要确定自己确实有这个需要。 另外一种做法是,把阻塞任务变成异步的。如果场景适用,服务器可以启动一个进程来执行耗时(等待资源)的任务,赋予该进程一个唯一的令牌,把令牌和原始请求者保存起来。当资源可用时,这个进程会把令牌附带在消息中发送给服务器。服务器最终会得到这个消息,通过令牌匹配原始请求者,并发送回应,期间不会被其他请求所阻塞42。 这种做法要比使用多个进程的方法更晦涩一些,也很容易造成回调地狱(callback hell),但是使用的资源要更少些。

erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”的更多相关文章

  1. erl_0019《硝烟中的erlang》 读书笔记005 “进程信息"

    对一个运行中的Erlang系统来说,进程绝对是重要的组成部分.正因为进程是所有运行实体的基础,因此会想去了解它们的更多信息.幸运的是,VM提供了大量的可用信息,其中有些可以安全使用,有些在生产环境中使 ...

  2. erl_0016 《硝烟中的erlang》 读书笔记003 “error_logger 爆炸”

    error_logger 爆炸 具有讽刺意味的是,负责错误日志的进程竟然是最为脆弱的之一.在Erlang的缺省安装中,error_logger39负责记录日志(写入磁盘或者发送到网络上),它的速度要比 ...

  3. erl_0015 《硝烟中的erlang》 读书笔记002 “为过载做计划”

    为过载做计划 到目前为止,我在实际工作中所碰到最常见的错误,基本上都是节点内存耗尽.而且通常都和过长的消息队列有关37.解决这类问题的方法有很多,不过只有在深入.全面的理解系统后,才能做出正确的选择. ...

  4. erl_0014 《硝烟中的erlang》 读书笔记001 “绪论”

    1.大家听说Erlang,往往是因为其对高并发的良好支持.其实,Erlang的核心特征是容错,从某种程度上讲,并发只是容错这个约束下的一个副产品.容错是Erlang语言的DNA,也是和其他所有编程语言 ...

  5. .Net中的AOP读书笔记系列之AOP介绍

    返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...

  6. 硝烟中的scrum学习笔记 - 怎样制定Sprint计划(Plan Meeting)

    1. 如何估算我们这个sprint能做多少个故事点 1) 本能反应 2) 生产率计算  估算生产率/实际生产率  看看团队的历史,看看他们在过去几个sprint里的生产率是多少  然后假定在下一个sp ...

  7. 《java并发编程实战》读书笔记8--死锁,性能与可伸缩性,锁粒度锁分解锁分段

    第10章 避免活跃性危险 10.1 死锁 -10.1.1 锁顺序死锁 最简单的一种死锁形式: -10.1.2 动态的锁顺序死锁 可以通过下面的方法来解决: -10.1.3 在协作对象之间发生死锁 -1 ...

  8. ITEYE中的读书笔记:重构其实就是持续改进

    原文地址:http://hawkon.iteye.com/blog/2093338#bc2355877 前段时间同事参加ITEYE的试读有奖, 没想到得了个奖,拿到一本书.由于同事的推荐我也认真读了一 ...

  9. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

随机推荐

  1. [小问题笔记(三)] SVN树冲突(Tree Conflict),文件不能提交的解决办法

    传说中SVN的树冲突是由不同开发者删除文件,移动文件神马的造成的. 我们遇到的情况是: 开发人员小B移动了项目中几个文件然后提交.开发人员小L更新项目至最新版本. 获取到移动后的文件则显示文件已被修改 ...

  2. C# winfrom listview 多窗口调用

    Form1 private void button1_Click(object sender, EventArgs e) { Form f = new Form2(ref listView1); f. ...

  3. php入门(一)

    一,在HTML中嵌入php代码 先看html的代码: <form action="processorder.php" method="post"> ...

  4. Jquery移动html到另一个标签下

    需求再现 <div id="div1"> <p>这是一段测试文本001</p> </div> <div id="di ...

  5. JavaScript高级程序设计-读书笔记(6)

    第20章 JSON JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量 JSON的语法可以表示一下三种类型的值 l        简单值:使用与JavaScript相同的语法,可以在JS ...

  6. flask学习(八):页面跳转和重定向

    1. 用处:在用户访问一些需要登录的页面的时候,如果用户没有登录,那么让页面重定向到登录页面 2. 实例 运行效果: 用户已登录,进入发布问答页面 用户未登录,跳转到登录页面

  7. 十八 Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/env python # -*- coding:utf8 -*- from scrapy.cmdline import ...

  8. javascript curry 柯里化函数 仿lodash的curry

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. iOS自动化探索(九)使用Jenkins自动化打包并发布iOS App

    继前一篇: Mac环境下安装Jenkins Jenkins安装好后, 我们试着创建一个iOS自动打包并发布的任务 iOS App构建必须在MAC上面使用xcode进行,所以我们要安装下xcode集成插 ...

  10. OLT配置学习

    1.console连接跟一般交换机一样,不赘述 2.修改系统名称 Add Hostname/Device Name: huawei(config)#system sys-info descriptio ...