Java的编年史和低延迟

总览

我正在看Typesafe的Rolan Kuhn在介绍反应流方面的出色演讲,乍一看似乎与《纪事报》有一些相似的目标,但是当您深入研究细节时,对我来说显然有一些关键假设是根本不同。

关键假设

《纪事》设计的主要假设是
  • 低延迟是您的问题,而不是吞吐量。 数据来自微突发,您希望在下一次微突发活动之前尽快处理。
  • 如果您忙碌,则不能暂停交流/制作人。 (或暂停最终用户不是一种选择)
  • 您的信息具有很高的价值,记录每个事件的详细时间非常有价值。 记录所有事件是了解微爆的关键。
  • 您希望能够检查过去发生的任何事件。

低延迟至关重要

纪事报旨在帮助您解决的关键问题是一致的低延迟。 它假定如果延迟足够低,那么吞吐量就不会有问题。 许多基于Web的系统都是为吞吐量而设计的,只要最终用户看不到延迟,延迟就不会成为问题。 对于软实时系统,大多数时候您都需要低延迟,而最坏情况下的延迟则要适度,这要比人类看到的快得多。

你无法阻止世界

另一个关键假设是流量控制不是一种选择。 如果您运行缓慢,则无法对交易所及其所有用户说,请等我一会儿再追。 这意味着生产者永远不会被消费者放慢脚步。
降低生产者速度实际上与增加延迟时间相同,但是此延迟时间很容易隐藏。 如果您等到生产者将事件标记为时间戳,则可以使延迟看起来更好。 如果您想采取更现实的措施,则应使用时间戳记,事件应该由生产者发送 ,并且不会延迟。

您需要记录所有内容以便重播

重放对于在一定条件下测试应用程序很有用。 例如,您可以更改您的应用程序,不仅可以看到它的行为正确,而且可以及时运行。 对于定量分析,他们将需要一组数据来调整其策略。

实时重播旧事件。

您不必记住以后要引用的事件副本,而可以记住它的索引,并可以按需稍后重播该事件。 这样可以节省堆中的内存,或仅在情况下复制数据。

微爆发对于理解您的系统至关重要。

一些系统的性能以每天的交易为特征。 这意味着,如果在前23个小时内没有完成任何事务,而所有事务都在最后一个小时内完成,那么您仍将每天执行这么多事务。 经常引用每天的交易是因为它的数量更高,但就我而言,整天简化工作量听起来很奢侈。
某些系统可能以每秒的事务数为特征。 这可能意味着这些事务可以在一秒钟内开始并完成,但并非总是如此。 如果您有1000笔交易,并且每毫秒进行一次交易,那么您将获得均匀的响应时间。 我发现更有趣的是一天中最忙的一秒钟的交易数量。 这样可以指示系统应该能够处理的流速。

检查微脉冲

考虑一个系统,该系统在相同的100微秒内获得30个事件,而这些突发间隔为100毫秒。 这可能显示为每秒(30 / 0.1)300个事务,这听起来相对容易,如果我们需要做的只是跟上进度,但是如果我们希望尽快做出响应,则短期/突发吞吐量为100中的30微秒或每秒30万个事件。
换句话说,要尽可能快地处理微爆发,您将需要一个系统,该系统能够处理的吞吐量比您在几秒钟,几分钟或一天内预期的吞吐量高出多个数量级。 理想情况下,系统的吞吐量将是一天中最忙的一秒钟的100倍。 在不减慢对这些数据突发的处理速度的情况下,每秒处理最繁忙的10毫秒所需的时间。

编年史如何改善微爆的处理

低垃圾率

最小化垃圾是避免GC暂停的关键。 为了有效地使用L1和L2缓存,您需要将垃圾率保持在非常低的水平。 如果您没有有效地使用这些缓存,则您的应用程序速度可能会慢2-5倍。
Chronicle中的垃圾非常低,您可以处理一百万个事件,而jstat不会检测到您创建了任何垃圾。 jstat仅在分配了新的TLAB时显示4 KB的倍数。 编年史确实会产生垃圾,但是它非常低。 即每百万个事件过程中有几个对象。
一旦使GC暂停易于管理或不存在,您便开始看到系统中的其他延迟源。 拿走巨石,您开始看到岩石。 拿走岩石,您开始看到鹅卵石。

支持全部写入模型。

众所周知,如果保持DEBUG级别登录,则会大大降低应用程序的速度。 在记录您以后可能想要知道的一切与对您的应用程序的影响之间存在紧张关系。
编年史设计得足够快,您可以记录所有内容。 如果替换系统中的队列和IPC连接,则可以提高性能,并且可以免费甚至更好地“记录所有内容”。
能够记录所有内容意味着您可以在系统的每个阶段添加跟踪时间,然后监视系统,还可以深入研究系统中最糟糕的1%延迟。 这不是您可以使用剖析器为您提供平均值的方法。
通过编年史,您可以回答以下问题: 系统的哪些部分负责一天中最慢的20个事件?

记事本与操作系统的交互最少。

系统调用速度很慢,如果可以避免调用操作系统,则可以节省大量的延迟。
例如,如果在回送时通过TCP发送消息,则在写入和读取数据之间可能会增加10微秒的延迟。 您可以写入编年史,这是对内存的简单写操作,也可以从编年史中读取,这也是从内存中读取的内容,延迟为0.2微秒。 (正如我之前提到的,您也将获得持久性)

无需担心用完堆。

无限制队列的一个常见问题,这使用了一个开放式堆。
Chronicle通过不使用堆来存储数据,而是使用内存映射文件来解决此问题。 通过使数据更紧凑,可以提高内存利用率,但也意味着1 GB的JVM一天可以流1 TB的数据,而不必担心堆或您拥有多少主内存。 在这种情况下,无界队列变得更易于管理。

结论

通过基于不同的假设,Chronicle解决了其他解决方案避免的问题,例如需要流控制或使用消息(删除已处理消息)。
Chronicle旨在更有效地利用您的硬件,因此您不需要说30个服务器的云即可每秒处理约一百万个事件(如许多基于云的解决方案所称),您可以与开发人员联系以达到此事件率笔记本电脑。

翻译自: https://www.javacodegeeks.com/2014/05/chronicle-and-low-latency-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复制物料时不复制安全库存

1.打开bos,选择物料-功能控制 2.把允许复制去掉 转载于:https://www.cnblogs.com/RogerLu/p/10441588.html

CSS实现水平垂直居中

1、需求分析 子元素在父元素中水平垂直居中 2、技术分析 基础的css、html 3、详细分析 如图: 3.1 HTML部分 如图所示&#xff0c;大边框内包含一个小边框两部分&#xff0c;设置一个父元素div和一个子元素div。 <div class"container">父元素<div class…

2008/5/5

go haywire 非常生气Imagination is the source of creation. 想象是创造之源.转载于:https://www.cnblogs.com/fishert/archive/2008/05/06/1184243.html

鸿蒙3部曲先看哪部,讨论雪鹰与鸿蒙三部曲的关系

1、相信番茄的每部小说出来&#xff0c;心里都在想这会不会是鸿蒙三部曲的最后一部呢&#xff0c;鸿蒙金榜最后一位掌控者呢。2、但是隔了这么多部&#xff0c;番茄依旧未写&#xff0c;第三部&#xff0c;让人不禁思考&#xff0c;会不会第三部是番茄的封山之作呢。3、如果说前…

python装饰器概念与应用

格式一&#xff1a;装饰器外层不传参&#xff0c;内层传参 user_status False # 用户登录了就把这个改成Truedef login(func): # 把要执行的henan模块从这里传进来def inner(*args, **kwargs): # 再定义一层函数&#xff0c;参数为henan的参数_username "alex" …

从Java连接到Cassandra

在我的帖子Hello Cassandra中 &#xff0c;我研究了如何下载Cassandra NoSQL数据库并使用cqlsh连接到Cassandra数据库。 在本文中&#xff0c;我将介绍从Java客户端连接到Cassandra数据库的基础知识。 尽管有几种可用于从Java访问Cassandra数据库的 框架 &#xff0c;但我将在…

Django---Model操作

一、字段 1 AutoField(Field)2 - int自增列&#xff0c;必须填入参数 primary_keyTrue3 4 BigAutoField(AutoField)5 - bigint自增列&#xff0c;必须填入参数 primary_keyTrue6 7 注&#xff1a;当model中如果没有自增列&#xff0c;则自动会创建…

8. Action过滤

Action过滤原文: http://quickstarts.asp.net/3-5-extensions/mvc/ActionFiltering.aspx1. 介绍一般Action与用户动作是一对一的关系,用户的某一个动作对应一个特定的Action.然而,有时你可能会希望在Action执行的前后执行指定的操作,MVC中可以通过Action过滤器来实现这个功能.A…

android运行时状态,Android 如何保存Android 运行时状态

Android 如何保存Android 运行时状态使用 SaveInstanceState去保存运行时数据首先&#xff0c;我们需要重写一下系统的public void onSaveInstanceState(Bundle savedInstanceState)方法并在onSaveInstanceState方法中添加需要保存的数据。最后我们可以在onRestoreInstanceStat…

程序文件分类及编写要求

一级&#xff1a;管理体系手册 由质量管理部负责编制&#xff0c;最高管理者批准后发布生效。举例如&#xff1a;XX公司管理手册 二级&#xff1a;管理体系程序文件 由各相关部门进行编写&#xff0c;质量管理部体系负责人审核通过各部门评审会签&#xff0c;由管理者代表批…

仿制药的美丽与陌生

最近&#xff0c;我正在为Oracle认证专家Java SE 7程序员考试做准备&#xff0c;而我恰巧在Java泛型领域遇到了一些看起来很奇怪的结构。 但是&#xff0c;我也看到了一些巧妙而优雅的代码。 我发现这些示例值得分享&#xff0c;这不仅是因为它们可以使您的设计选择更容易&…

C# 判断txt文件编码格式

/// <summary> /// 获取文件的编码格式 /// </summary> public class EncodingType{/// <summary> /// 给定文件的路径&#xff0c;读取文件的二进制数据&#xff0c;判断文件的编码类型 /// </summary> /// <param name“FILE_NAME“>文件路径&…

Vuex的第一次接触

前言&#xff1a;最近在做Vue实现去哪网&#xff0c;想要实现在城市列表页面&#xff0c;点击某个城市的时候&#xff0c;主页的头部的城市会随着改变&#xff0c;就是首页和城市页面有共用的数据要分享&#xff0c;这里使用Vuex 1. Vuex是什么&#xff1f; 是Vue官方推荐的数…

乐刻运动 app android,乐刻运动

乐刻运动是一款广受欢迎的运动健身软件&#xff0c;不论你是想打造完美身材还是减脂减重&#xff0c;乐刻运动都会为你制定严格而又科学的运动健身计划&#xff0c;相当于一个掌上私人的健身教练&#xff0c;时刻关注你的健身状况&#xff0c;快来下载试试吧。乐刻运动软件优势…

新的公司:Dendrite

开始新的学习 好好学好技术&#xff0c;为了未来.ganjuebucuo 转载于:https://www.cnblogs.com/xinhua327/articles/1188299.html

RK3288 mipi屏调试流程

CPU&#xff1a;RK3288 系统&#xff1a;Android 5.1 1、修改kernel/arch/arm/configs/rockchip_defconfig&#xff0c;打开mipi屏开关 # CONFIG_LCD_GENERAL is not set CONFIG_LCD_MIPIy CONFIG_RK_TRSMy # CONFIG_RK32_LVDS is not set # CONFIG_RK32_DP is not set # CONFI…

java IO流小结

Java流操作有关的类或接口&#xff1a; Java流类图结构&#xff1a; 流的概念和作用 流是一组有顺序的&#xff0c;有起点和终点的字节集合&#xff0c;是对数据传输的总称或抽象。即数据在两设备间的传输称为流&#xff0c;流的本质是数据传输&#xff0c;根据数据传输特性将流…

华为android是什么型号,华为手机机型众多,目前这几款最值得入手

华为手机机型众多&#xff0c;目前这几款最值得入手2020-09-22 15:00:033点赞0收藏0评论华为手机可以说是国家手机的代名词。受某种感情的影响&#xff0c;很多人都用华为取代了iPhone。为了表达感情&#xff0c;很多人也纷纷效仿&#xff0c;购买华为手机。但我想说的是支持华…

向Java添加@atomic操作

总览 原子操作如何在Java中工作&#xff0c;OpenJDK / Hotspot中是否存在可以转换为原子的当前替代方法。 反馈 在我以前的文章中&#xff0c; 对可变字段进行原子操作。 有人指出&#xff0c;无论好意如何&#xff0c;“修复”先前的行为都不太可能继续进行。 替代方法是添加…

JSP页面中使用超链接进行传输参数(参数是一个本地磁盘链接)问题

在使用COS组件进行文件上传下载时遇到一个下载问题 刚开始我存的地址格式为&#xff1a;D:\tool\upload发现一直报Error parsing HTTP request header Note: further occurrences of HTTP header p的错误 后来发现使用超链接传参数不支持“\”字符&#xff0c;可能是转义字符…