Disruptor

基于spring boot开发的Javaweb项目源码分享

一笑奈何 提交于 2020-08-07 05:14:23
简介 该项目是基于SpringBoot 2+Spring+Mybatis+Hibernate的敏捷开发系统;它是一款具有代码生成功能的智能快速开发平台;是以Spring Framework为核心容器,Spring MVC为模型视图控制器,Hibernate为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Disruptor作为并发框架,Bootstrap作为前端框架的优秀开源系统。 项目架构如下: jeeweb ├─jeeweb-common 公共模块 │ ├─jeeweb-common-base 公用基础模块 │ │ │ ├─jeeweb-common-email 邮件基础模块 │ │ │ ├─jeeweb-common-hibernatemvc hibernate公用模块 │ │ │ ├─jeeweb-common-mybatismvc mybatis公用模块 │ │ │ ├─jeeweb-common-oss 数据存储公用模块 │ │ │ ├─jeeweb-common-quartz quartz公用模块 │ │ │ ├─jeeweb-common-query 查询封装模块 │ │ │ ├─jeeweb-common-security 安全公用模块 │ │ │ ├─jeeweb-common-sms 短信公用模块 │ │ │ └

UiPath获2.25亿美元E轮融资

谁说我不能喝 提交于 2020-08-05 06:29:42
在 24 个月的时间里,该 RPA 与 AI 领导企业的年度经常性收入从 1 亿美元增长到超过 4 亿美元;计划推进市场领先的超自动化平台,扩展云产品线 纽约--(美国商业资讯)-- 机器人流程自动化(RPA) 软件领导企业UiPath日前宣布已完成2.25亿美元E轮融资,交易后估值达102亿美元。本轮融资由Alkeon Capital Management领投。其他投资方包括Accel、Coatue、Dragoneer、IVP、Madrona Venture Group、红杉资本、腾讯、Tiger Global、Wellington,并由T. Rowe Price Associates公司提供资金和账户咨询。UiPath的年度经常性收入(ARR)超过4亿美元,是全球增长最快的企业软件公司之一。 根据Forrester研究公司的报告,“随着我们从危机中走出,企业将把自动化作为降低风险的一种方式,未来的危机将对劳动力的供应和生产效率构成威胁。”*随着自动化正在成为董事会的当务之急,UiPath将利用这笔资金继续投资研发。UiPath在2020年5月宣布推出端到端超自动化平台,专注于加速并实现自动化应用的民主化,以帮助客户提供更好的客户体验,让全球员工能够使用,也能体验软件机器人的最优价值。无论是在本地还是云端部署,UiPath客户都能获得最适合其组织的灵活部署方案。

撮合交易系统服务边界与设计

时光怂恿深爱的人放手 提交于 2020-08-04 14:28:40
如何设计并实现一个数字货币交易系统 证券交易系统是金融市场上能够提供的最有流动性,效率最高的交易场所。和传统的商品交易不同的是,证券交易系统提供的买卖标的物是标准的数字化资产,如USD、股票、BTC等,它们的特点是数字计价,可分割买卖。 证券交易系统通过买卖双方各自的报价,按照价格优先、时间优先的顺序,对买卖双方进行撮合,实现每秒成千上万的交易量,可以为市场提供高度的流动性和价格发现机制。 一个完整的数字货币交易系统是由用户系统(sso)、账户系统(account)、订单系统(order)、撮合系统(match)、以及清算系统( clearing )、行情系统(market) 和钱包系统(wallet)构成的。各个子系统相互配合,完成数字货币报价交易。 SSO:用户全局登录,身份验证,权限现在; account:用户用户数字货币相关操作,查看账户、划转、冻结等操作; order:提供给下单,撤单,委托列表,历史交易记录; match: 撮合引擎是交易系统的核心。撮合引擎本质上就是维护一个买卖盘列表,然后按价格优先原则对订单进行撮合,能够成交的就输出成交结果,不能成交的放入买卖盘。这里注意没有时间优先原则,因为经过定序的订单队列已经是一个时间优先的队列了。 clearing: 清算的工作就是把买单冻结的USD扣掉,并加上买入所得的BTC,同时,把卖单冻结的BTC扣掉

Disruptor之ExceptionHandler

醉酒当歌 提交于 2020-07-29 09:42:13
Disruptor的版本3.4.2. List-1 public interface ExceptionHandler<T> { /** * <p>Strategy for handling uncaught exceptions when processing an event.</p> * * <p>If the strategy wishes to terminate further processing by the {@link BatchEventProcessor} * then it should throw a {@link RuntimeException}.</p> * * @param ex the exception that propagated from the {@link EventHandler}. * @param sequence of the event which cause the exception. * @param event being processed when the exception occurred. This can be null. */ void handleEventException(Throwable ex, long sequence, T event); /** * Callback to

伪共享(false sharing)

故事扮演 提交于 2020-07-26 06:34:54
伪共享(false sharing),并发编程无声的性能杀手 在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素。前段时间学习了一个牛X的高性能异步处理框架 Disruptor,它被誉为“最快的消息框架”,其 LMAX 架构能够在一个线程里每秒处理 6百万 订单!在讲到 Disruptor 为什么这么快时,接触到了一个概念——伪共享( false sharing ),其中提到:缓存行上的写竞争是运行在 SMP 系统中并行线程实现可伸缩性最重要的限制因素。由于从代码中很难看出是否会出现伪共享,有人将其描述成无声的性能杀手。 本文仅针对目前所学进行合并整理,目前并无非常深入地研究和实践,希望对大家从零开始理解伪共享提供一些帮助。 伪共享的非标准定义为:缓存系统中是以缓存行(cache line)为单位存储的,当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。 下面我们就来详细剖析伪共享产生的前因后果。首先,我们要了解什么是缓存系统。 一、CPU 缓存 CPU 缓存的百度百科定义为: CPU 缓存(Cache Memory)是位于 CPU 与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。】 高速缓存的出现主要是为了解决 CPU

Cache写策略(Cache一致性问题与骚操作)

China☆狼群 提交于 2020-07-25 20:00:21
写命中 写直达(Write Through) 信息会被同时写到cache的块和主存中。这样做虽然比较慢,但缺少代价小,不需要把整个块都写回主存。也不会发生一致性问题。 对于写直达,多出来%10向主存写入的存储指令使得其比其单纯向Cache写入的速度慢上将近10倍。这种速度不一致的问题,不管是在硬件结构还是软件,有着一条“不管怎么样,先试试这样行不行”的办法:并行加缓冲。 我们使用写缓冲(Write Buffer)来解决这个问题,CPU写入Cache的同时会写入Write Buffer。缓冲中的内容什么时候写入主存交给存控(Memory Controller)来控制,CPU将省下的时间去处理其他事情。 Write Buffer是一个FIFO队列,一般只有4字节。 然而当写操作频繁的时候,这点容量就不够用了,容易饱和发生阻塞,就相当于没加一样... 解决的办法可以是再加一级Cache,变成二级缓存。什么,你问为什么不把两级Cache和一起,搞那么多干什么?这个二级当然是慢一点的便宜货,咱们弄这些东西,不就是因为越快东西越贵,买不起嘛土豪! 对于缓冲的问题,还有个关于合并写对程序效率的影响, 具体可以参考这篇博文 。 第二种办法就是改变策略使用写回,也就是下面介绍的方法。 写回(Write Back) 信息仅仅写到Cache中的块。当其被替换时,信息才会被写回到主存中

企业开发-log4j 最新版本2使用简介

扶醉桌前 提交于 2020-05-04 12:36:15
1、官网http://logging.apache.org/log4j/2.x/index.html 2、SLF4J目前已经是业界标准,完整兼容和实现 3、如何兼容版本1?log4j-1.2-api-2.4.1.jar这个包,但是还是有一些接口是变化了,个人看了下都是些不常用的接口变了,如果你用到请修改源代码。参考官方 http://logging.apache.org/log4j/2.x/manual/migration.html 4、多个 SLF4J实现不能共存,共存需要解决一些冲突问题 5、log4j-slf4j-impl和log4j-to-slf4j不能共存,从名称就能看出一个是log4j对SLF4J的实现,一个是反过来。一起会报错 6、新特征:支持异步日志更强大。因为公司需要分布式日志,所以是用scala actor写的,当时也有测试使用Disruptor,效率极高,没想到就出来了,哈哈。 7、新的语法 logger.debug("Logging in user %s with birthday %s", user.getName(), user.getBirthdayCalendar()); logger.debug("Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user

首次排查 OOM 实录

南笙酒味 提交于 2020-05-03 19:51:23
一、前言 距离上篇文章更新已经一月有余,之所以一直没更新一是工作最近比较忙,二是感觉产出不了什么对自己和他人有价值的文章。因此这段时间,主要的空闲时间在学习技术和写 GitHub,博客这边就暂时落下了。 本篇文章的落成更像是一篇笔记,而不是博客。因为在一年的工作后,首次碰上了 OOM 问题,虽然导致的原因比较简单,但也算是值得纪念的,哈哈。 二、问题复现 代码源码:https://github.com/jitwxs/disruptor-study/blob/master/disruptor-demo/src/test/java/jit/wxs/disruptor/demo/oom 问题原因和 Disruptor 相关,如果不了解的同学,就把它理解成一个首尾相连的环形 Queue 就 OK 了。 2.1 代码实现 首先创建 Disruptor 存放的实体类 Entity,它有个对象叫 dataList,存放的是 EntityData 的引用: @Data public class Entity { private long id ; private List < EntityData > dataList ; } @Data @NoArgsConstructor ( access = AccessLevel . PRIVATE ) @AllArgsConstructor public

来,带你鸟瞰 Java 中的并发框架!

北城以北 提交于 2020-04-28 20:13:15
作者:唐尤华 https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1 1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细节决定成败”。最终我们意识到 NoSQL 不是解决所有问题的银弹,而 NoSQL vs RDMS 的答案是:“视情况而定”。 类似地,去年RxJava 和 Spring Reactor 这样的并发库加入了让人充满激情的语句,如异步非阻塞方法等。为了避免再犯同样的错误,我们尝试评估诸如 ExecutorService、 RxJava、Disruptor 和 Akka 这些并发框架彼此之间的差异,以及如何确定各自框架的正确用法。 本文中用到的术语在这里有更详细的描述。 2. 分析并发框架的示例用例 3. 快速更新线程配置 在开始比较并发框架的之前,让我们快速复习一下如何配置最佳线程数以提高并行任务的性能。 这个理论适用于所有框架,并且在所有框架中使用相同的线程配置来度量性能。 对于内存任务,线程的数量大约等于具有最佳性能的内核的数量,尽管它可以根据各自处理器中的超线程特性进行一些更改。 例如,在8核机器中

来,带你鸟瞰 Java 中的并发框架!

[亡魂溺海] 提交于 2020-04-27 15:09:55
作者:唐尤华 https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1 1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细节决定成败”。最终我们意识到 NoSQL 不是解决所有问题的银弹,而 NoSQL vs RDMS 的答案是:“视情况而定”。 类似地,去年RxJava 和 Spring Reactor 这样的并发库加入了让人充满激情的语句,如异步非阻塞方法等。为了避免再犯同样的错误,我们尝试评估诸如 ExecutorService、 RxJava、Disruptor 和 Akka 这些并发框架彼此之间的差异,以及如何确定各自框架的正确用法。 本文中用到的术语在这里有更详细的描述。 2. 分析并发框架的示例用例 3. 快速更新线程配置 在开始比较并发框架的之前,让我们快速复习一下如何配置最佳线程数以提高并行任务的性能。 这个理论适用于所有框架,并且在所有框架中使用相同的线程配置来度量性能。 对于内存任务,线程的数量大约等于具有最佳性能的内核的数量,尽管它可以根据各自处理器中的超线程特性进行一些更改。 例如,在8核机器中