高速异步缓冲区
林小应
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
分享到:
相关推荐
异步传输与同步传输的区别 异步传输(Asynchronous Transmission)是一种常用的...异步传输适用于低速设备,而同步传输适用于高速设备。异步传输的实现比较容易,但开销较大,而同步传输的实现较为复杂,但开销较小。
在编程领域,缓冲区是一种非常重要的概念,尤其是在处理大量数据传输和提高程序性能时。C#作为.NET框架的一部分,提供了丰富的支持来处理缓冲区。在这个“C#缓冲区分析代码”中,我们可以深入理解如何在C#中有效地...
在C#中,同步和异步Socket编程还涉及到`SocketAsyncEventArgs`类,这是一个优化的异步操作容器,可以减少对象创建的开销,提高大规模并发操作的性能。开发者可能会在实例中看到如何使用`SocketAsyncEventArgs`类来...
这种结构通常用于队列,如进程调度、缓冲区管理和I/O操作。在多线程或分布式系统中,FIFO可以确保数据处理的公平性和顺序性。 同步FIFO是指在多个线程或进程之间共享的FIFO,其访问需要进行同步控制,以避免数据...
`SocketAsyncEventArgs` 类提供了一个方便的机制来管理缓冲区,它可以减少对象创建和销毁的开销。 6. **错误处理**:由于异步操作可能在任何时刻完成,因此必须确保错误处理是线程安全的,并且能够在回调函数中正确...
另外,AIO 操作可能会在用户态和内核态之间进行多次上下文切换,这可能会引入额外的开销,因此在性能敏感的应用中需要谨慎评估。 总之,Linux 的异步 I/O 提供了一种优化 I/O 性能的有效方式,通过 AIO API,开发者...
9. 性能优化:为了提高性能,可以使用缓冲技术,预先分配内存以减少内存分配的开销,并且合理设置Socket的缓冲区大小。 10. 安全性:在处理数据库和网络通信时,安全性至关重要。应使用加密的连接(如SSL/TLS),并...
异步传输,也称为非阻塞I/O,意味着当Socket调用发送或接收数据时,如果数据未准备好,调用将立即返回,而不是等待数据就绪。这种方式允许程序继续执行其他任务,提高了系统的并发性和效率。 在Java中,可以使用`...
在GLIBC中,异步I/O函数使用的主要数据结构是异步I/O控制块(aio_request),它包含了关于异步操作的所有信息,如文件描述符、偏移量、操作类型、缓冲区地址等。例如,`aio_fildes`存储文件描述符,`aio_nbytes`表示...
10. **性能优化**:在实际应用中,考虑性能优化是非常重要的,比如使用缓冲区来减少内存分配,使用非阻塞IO来避免线程上下文切换的开销,以及合理设置Socket的缓冲区大小、超时时间等参数。 综上所述,C#的Socket...
本文将深入探讨“Socket异步传输数据实例(客户端服务端)”这一主题,涉及并发处理、异步操作以及`SocketAsyncEventArgs`对象池和内存地址池等关键知识点。 首先,我们要理解Socket的基本概念。Socket是网络编程的...
6. **性能优化**:异步Socket编程需要考虑缓冲区管理、并发连接数控制、超时策略等,以达到最佳的性能表现。 通过这两个异步传输的例子,开发者可以学习到如何在实际项目中运用这些技术,提升系统的并发性和效率,...
环形缓冲区(Circular Buffer)是一种在内存管理中常见的数据结构,它被广泛应用于各种实时系统、通信协议和数据采集系统中。在Delphi编程环境中,实现环形缓冲区可以帮助开发者高效地处理数据流,避免数据丢失并...
异步通信是网络编程中的一个重要概念,与同步通信相比,它允许程序在等待网络操作完成时继续执行其他任务,提高了程序的效率和响应性。在C++中实现WINSOCKET异步通信,通常会使用到以下技术: 1. **事件驱动编程**...
此外,日志记录还需要考虑性能优化,比如批量处理日志队列、使用环形缓冲区减少内存分配和释放的开销,以及在磁盘I/O繁忙时进行适当的日志丢弃策略等。 总结起来,Linux下的异步日志记录类`debugger`和`debug_msg`...
6. **AsyncWriter框架**:虽然这个框架的具体实现未详细说明,但通常它会提供一个抽象的异步写入机制,可能包括一个异步缓冲区,用于批量处理写入请求,以及一个后台线程或线程池,负责实际的写入操作,并在完成时...
Reactor模式是一种事件驱动的设计模式,适用于Java异步编程。Java中的Reactor实现,如Spring Reactor或Netty,提供了高度可扩展的事件处理框架。它们支持事件处理器的注册、分发和取消,允许应用程序以响应式的方式...
2. **缓冲区(Buffer)**:缓冲区是NIO中的核心概念,它是数据的容器。读取数据时,数据首先会被读入到缓冲区,然后再从缓冲区提取;写入数据时,先写入缓冲区,再从缓冲区写入通道。 3. **选择器(Selector)**:选择...
这个类是.NET Framework为Socket异步操作提供的事件驱动模型,它可以显著减少线程上下文切换的开销,提高程序执行效率。通过注册事件回调,开发者可以编写非阻塞的代码,使得服务器能同时处理大量连接。 在C#中,...