lmax网页版本服务器,LMAX Disruptor——一个高性能、低延迟且简单的框架

本文主要是介绍lmax网页版本服务器,LMAX Disruptor——一个高性能、低延迟且简单的框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Disruptor是一个用于在线程间通信的高效低延时的消息组件,它像个增强的队列,并且它是让LMAX Exchange跑的如此之快的一个关键创新。关于什么是Disruptor、为何它很重要以及它的工作原理方面的信息都呈爆炸性增长 —— 这些文章很适合开始学习Disruptor,还可跟着LMAX BLOG深入学习。这里还有一份更详细的白皮书。

虽然disruptor模式使用起来很简单,但是建立多个消费者以及它们之间的依赖关系需要的样板代码太多了。为了能快速又简单适用于99%的场景,我为Disruptor模式准备了一个简单的领域特定语言。例如,为建立一个消费者的“四边形模式”:

106584654_1.png

在这种情况下,只要生产者(P1)将元素放到ring buffer上,消费者C1和C2就可以并行处理这些元素。但是消费者C3必须一直等到C1和C2处理完之后,才可以处理。在现实世界中的对应的案例就像:在处理实际的业务逻辑(C3)之前,需要校验数据(C1),以及将数据写入磁盘(C2)。

用原生的Disruptor语法来创建这些消费者的话代码如下:

01Executor executor = Executors.newCachedThreadPool();

02BatchHandler handler1 =new MyBatchHandler1();

03BatchHandler handler2 =new MyBatchHandler2();

04BatchHandler handler3 =new MyBatchHandler3()

05RingBuffer ringBuffer =new RingBuffer(ENTRY_FACTORY, RING_BUFFER_SIZE);

06ConsumerBarrier consumerBarrier1 = ringBuffer.createConsumerBarrier();

07BatchConsumer consumer1 =new BatchConsumer(consumerBarrier1, handler1);

08BatchConsumer consumer2 =new BatchConsumer(consumerBarrier1, handler2);

09ConsumerBarrier consumerBarrier2 =

10ringBuffer.createConsumerBarrier(consumer1, consumer2);

11BatchConsumer consumer3 =new BatchConsumer(consumerBarrier2, handler3);

12executor.execute(consumer1);

13executor.execute(consumer2);

14executor.execute(consumer3);

15ProducerBarrier producerBarrier =

16ringBuffer.createProducerBarrier(consumer3);

在以上这段代码中,我们不得不创建那些个handler(就是那些个MyBatchHandler实例),外加消费者屏障,BatchConsumer实例,然后在他们各自的线程中处理这些消费者。DSL能帮我们完成很多创建工作,最终的结果如下:

1Executor executor = Executors.newCachedThreadPool();

2BatchHandler handler1 =new MyBatchHandler1();

3BatchHandler handler2 =new MyBatchHandler2();

4BatchHandler handler3 =new MyBatchHandler3();

5DisruptorWizard dw =new DisruptorWizard(ENTRY_FACTORY,

6RING_BUFFER_SIZE, executor);

7dw.consumeWith(handler1, handler2).then(handler3);

8ProducerBarrier producerBarrier = dw.createProducerBarrier();

我们甚至可以在一个更复杂的六边形模式中构建一个并行消费者链:

106584654_2.png

1dw.consumeWith(handler1a, handler2a);

2dw.after(handler1a).consumeWith(handler1b);

3dw.after(handler2a).consumeWith(handler2b);

4dw.after(handler1b, handler2b).consumeWith(handler3);

5ProducerBarrier producerBarrier = dw.createProducerBarrier();

这个领域特定语言刚刚诞生不久,欢迎任何反馈,也欢迎大家从github上fork并改进它。

106584654_4

从小喜欢打游戏,现在在育碧写游戏,可是却不喜欢玩自己做的游戏,人在江湖身不由己。

希望能与同行们,尤其是游戏服务器开发领域的同行多多交流。

106584654_5.png添加本文到我的收藏

这篇关于lmax网页版本服务器,LMAX Disruptor——一个高性能、低延迟且简单的框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175803

相关文章

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地