使用阻塞调用模式将需要:
1. Listening on a socket vector of size N
2. When a message arrives, you wake up with a start in time K, find and start processing the message, employing a time T (it does not matter if the processing is offloaded to another thread: in this case T becomes your offloading time)
3. You finish examining the vector and GOTO 1
所以,你可能会说,如果M邮件到达,并在K + M * T调度时间的另一个消息到达时,M + 1个消息会发现自己在等待K + M * T时间。这是否可以接受你的K(常数),M(交通功能)和T(资源和系统负荷的功能)的期望值?
异步处理,实际上并不存在。总是会有一个“同步”的IO回路,只有它会很好地集成在内核(甚至是硬件)中,它会比你自己的速度快10-100倍,因此可能会更好地扩展M的值很大。延迟的形式仍然是K1 + M * T1,但是这次K1和T1要低得多。或者,也许K1稍高一些,T1明显较低:对于大数值的M,架构“可以更好地扩展”。
如果M的值通常很低,那么异步性的优势就会比较小。在荒谬的情况下,当您在应用程序生命周期中只有一条消息时,同步或异步使得几乎没有区别。
考虑到另一个因素:如果消息的数量变得非常大,异步性有其优势;但是如果消息本身是独立的(由消息A引起的变化不影响消息B的处理),那么你可以保持同步并且水平地缩放,准备数量为Z的“消息集中器”,每个消息集中器接收分数M/Z的总流量。
如果处理过程需要对其他服务执行其他调用(缓存,持久性,信息检索,认证...),增加T因子,那么转向多线程甚至异步就会更好。使用多线程技术,您可以将T刮至其价值的一小部分(仅限调度时间)。从某种意义上来说,异步处理是一样的,但是更多的是剃须,并且为您处理更多的编程样板文件。
我的应用程序确实是高频交易,是的,我确实需要持久性,但会有一个单独的进程,将持续的数据,这将使用某种共享内存或IPC共享。 – jaybny 2012-07-22 18:13:06
好的。如果您可以快速地将持久性任务以非阻塞的方式卸载到另一个图层,那么您可能会赢。 @ lserni(下图)的分析非常好。 – Carlos 2012-07-22 20:48:38
仍然试图弄清楚如何“以非阻塞的方式卸载持久性”..我不能从多线程重播或多播到_localhost_?不会_OS_通过_UDP_并发发送单个流,并且所有这些都是异步执行的?我的操作系统现在是_windows_,但操作系统不重要。 ty – jaybny 2012-08-02 04:26:25