`
lxy2520
  • 浏览: 6082 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

高速异步缓冲区、将同步操作转化成异步、没有“等待返回”的开销——适用于所有次重要的操作

 
阅读更多

高速异步缓冲区

林小应

1. 问题描述

有一封信要寄出去,你不会傻到自己送过去吧,写上地址、投进街边邮筒就可以了,自己继续干其他事情。

KFC把送外卖的事情都交给了宅急送。如果自己干,一天还能卖几个鸡翅啊。

……

有些事情,不是非常重要,也不影响后续工作,但又比较耗时的,可以交给专门的人或机构去完成,自己腾出手来继续干其他事。可以很大的提高工作效率。

计算机程序也是这样,比如要将一些日志送到远程日志主机,或者要将配置数据存到Memcached(简称MC),如果由主线程自己完成,会浪费很多时间在等待返回上。可以起一批线程来负责传送日志、存配置数据等。主线程需要传送日志或者存配置数据到MC时,只需要将动作包装成一个动作对象,丢进公共的容器、就像“邮筒”。一批线程会不断的扫描“邮筒”,只要发现有新的动作对象,就从中取出执行掉。

2. 期望

将一些不是非常重要,不影响后续工作的动作,包装成动作对象,交给缓冲区完成,就像new一个对象一样简单。

3. 设计原理

思路:新建一个队列,存储动作对象,再新建一批工作线程来执行对象。客户端有需要执行的动作,只需要封装成动作对象,丢进队列就可以了。

一个缓冲区由N个缓冲队列组成

一个缓冲队列由一个队列、m工作线程、一个监控线程组成

队列:用来保存待执行的动作对象

工作线程:不断扫描队列,发现有新的动作对象加进来,就取出执行掉

监控线程:监控工作线程的状态,如果发现有线程死掉,就重新启动该工作线程,如果重启十次仍不成功,就重现一个工作线程替换原来的。还负责监控队列执行的情况,如果最近t毫秒(我们配的是100ms)推送进来的动作对象没有执行完,则暂停该缓冲区,后续推送进来的动作对象不入队列,直接执行动作。

以上变量 n、m、t都是可配置的

抽象的数据模型:

缓冲区模型:

上面是一个5*5的缓冲区,就是有5个缓冲队列,每个队列有5个守护线程在不断扫描,一旦发现新的动作对象,就取出执行。

4.用法示例

动作对象模型:

/**
 * @author linxy 2012-11-30
 *
 */
public abstract class AsynItem {
	public final long birthTime = System.currentTimeMillis();
	public abstract boolean launch(); 
}

缓冲队列中存放的必须是该类型的动作对象

动作对象类型为AsynItem,只有一个方法launch,所有推送进来的对象只要实现launch方法就可以了,工作线程拿到动作对象以后,会执行launch方法。

利用缓冲区保存日志的例子:

      AsynItem item = new AsynItem() {

        publicboolean launch() {

              client.sendMsg(msg);

              returntrue;

           }

       };

       AsynLaunchUtil.asynLaunch (item);

第一句是new一个动作对象,要执行动作是client.sendMsg(msg);第二句AsynLaunchUtil.asynLaunch (item);是将对象丢进缓冲区。

5. 说明

在我们的系统中,缓冲区在收集日志、保存配置数据到memcached等方面很大的提高了性能,运行稳定。而且通用性很好,调用简单——就像上面只需要两行代码。

QQ:346420558

分享到:
评论

相关推荐

    zlog作者主分支最新代码,方便网络不好的朋友 只需要头文件和库就可以使用

    高效缓冲:ZLog 使用了内存缓冲区来暂存待写入的日志数据,通过批量写入的方式减少磁盘 I/O 操作次数,提高写入效率。 零拷贝技术:ZLog 在设计上避免了多次内存拷贝操作,尽可能地减少了数据复制带来的性能开销...

    netty面试专题-答案-一起学习

    BIO 是面向流的,NIO 是面向缓冲区的;BIO 的各种流是阻塞的。而 NIO 是非阻塞的;BIO 的 Stream 是单向的,而 NIO 的 channel 是双向的。 NIO 的特点:事件驱动模型、单线程处理多任务、非阻塞 I/O,I/O 读写不再...

    基于C语言+skynet实现的一个简单的日志库源代码

    独立线程负责刷新缓冲区,文件切换和文件异常的处理。 多线程日志生产者之间由互斥锁解决写同步问题。 文件采用大小切割时,采用倒序递增,保持后缀.0为最新日志文件。 文件采用小时切割时,采用%Y%m%d-%H格式日志名。 ...

    Oracle9i的init.ora参数中文说明

    如果要在没有调度程序的情况下仍能连接到数据库, 请将该值设置为与例程名相同。此参数自 8.1.3 版起已废弃。 值范围: 根据操作系统而定。 默认值 :0 mts_sessions: 说明 : 指定允许的共享服务器体系结构用户会话的...

    dsPIC33CK256MP508 中文版 数据手册(带书签)

    具有高分辨率PWM和CAN灵活数据(CAN FD)的28/36/48/64/80引脚16位数字信号控制器 工作条件 • 3.0V至3.6V, -40°C至+125°C, DC至100 MIPS ...- 4级深度捕捉缓冲区 • 全异步操作,可在休眠模式下工作

    计算机系统结构试题集

    主要缺点:每个结点需要有足够大的缓冲区来存储最大信息包。在最坏的情况下与存储转发方式的 通信时延是一样的,经过的每个结点都发生阻塞,都需缓冲。 D.存储转发建立源结点到目的结点的物理通路开销很大,占用...

    Lightshield:模块化的自动防暴API服务。 以自动化方式从api获取数据

    缓冲区是有限的,因为它不会在服务链的任何点建立大量的开销。 服务使用本地SQLite数据库来保存有关已执行的呼叫/最新统计信息的详细信息。 此数据未保存在Redis数据库中,因为内存成本过高。 服务使用集中式服务...

    Sybase ASE 15.7 开发文档:系统管理指南(卷二)

    较大逻辑页大小和缓冲区 .......... 32 堆内存 .......... 32 Adaptive Server 如何使用内存 .......... 34 确定 Adaptive 所需的内存量 .......... 36 确定 Adaptive Server 内存配置 .......... 37 如果正在升级 ....

    dsPIC33CH512MP508系列中文数据手册.pdf

    dsPIC33CH512MP508系列 具有高分辨率PWM和CAN灵活数据速率(CAN FD)的 48/64/80引脚双核16位数字信号控制器 工作条件 • 3V至3.6V, -40°C至+125°C: ...- 4级深度捕捉缓冲区 - 全异步操作,可在休眠模式下工作

    WebServer:C ++ Linux Web服务器服务器

    利用单例模式与双向同步实现异步的日志系统,记录服务器运行状态;利用RAII机制实现了数据库连接池,减少了数据库连接建立与关闭的开销,同时实现了用户注册登录功能。增加logsys,threadpool测试单元(待办事项:...

    Symbian OS C++高效编程

    787.5 定长数组 797.6 动态缓冲区 807.7 小结 82第8章 使用活动对象的事件驱动多任务 848.1 多任务基础 848.2 事件驱动多任务 858.3 使用活动对象 878.4 示例代码 908.5 没有活动调度器的线程 938...

    网络互连_网桥.路由器.交换机和互连协议

    本书适用于作为大专院校计算机专业本科生网络课程的教材,也适用于从事网络研究的技术人员和其他对网络技术有兴趣的人员。 译者序 前言 第1章 网络基本概念 1 1.1 网络分层模型 1 1.2 服务模型 5 1.3 网络的重要...

    three.d:Three.d 是用 D 编程语言从头开始编写的高性能 3D 图形引擎

    #三.d 高性能 3D 图形引擎 Three.d 是用 D 编程语言从头编写的高性能 3D 图形引擎。 它目前尚未准备好用于任何生产用途!... 异步缓冲区传输 依赖关系 gfw3 同化 自由图像 自由打字机 (AntTweakBar)

    Cisco路由器手册

    10.8 APPN缓冲区和内存管理 178 第11章 ISDN和DDR设计 180 11.1 站点选项 180 11.2 中心办公室交换机考虑 180 11.3 PRI和BRI 182 11.4 DDR模型 182 11.5 DDR拨号云 182 11.6 IP编址 183 11.7 拓扑 183 11.7.1 点到点...

    编写设备驱动程序

    通用于所有驱动程序的入口点 ............................................................................................... 39 用于块设备驱动程序的入口点 ..................................................

Global site tag (gtag.js) - Google Analytics