- 博客(52)
- 资源 (2)
- 收藏
- 关注
原创 理解HBase和BigTable
最近在了解HBase,作为一个HBase小白,迫切的想对HBase有一个较为直观的认识,但大部分文章切入的角度喜欢和RDMS做比较,看下来千篇一律,没有清晰形象的解释清楚HBase的基本数据模型。HBase官方手册中推荐了两篇博客,个人认为写的醍醐灌顶,比较适合我这种愚钝的人,决定用蹩脚英文稍加翻译记录,方便下次快速回忆。十分感谢Jim Wilson的这篇文章,让我比较清楚的了解HBase的基础...
2020-03-22 22:53:58
677
原创 rocketmq-事务消息
前言之前有转载过一篇关于分布式事务最终一致的MQ实现的文章,当时也是碰到了分布式事务的情形,最后按照文章的思路利用rmq实现了数据的最终一致。不太清楚分布式事务的,可以先看下这边文章了解下。PS:本篇默认你已经了解rmq的一些基础并看过部分源代码,建议在看该篇时,先看下官方的文档RocketMQ事务消息。牵涉到的分布式的话题一般都会提到CAP,从知乎上打捞来一份比较好解释。P 意指分区容...
2019-09-26 19:53:39
357
原创 思考延时队列
更多请移步我的博客背景项目中存在以下场景需要延迟触发一些事件:订单在未支付状态下30分钟后自动关闭;订单超过15天未主动确认收货需要自动确认收货;商品价格需要在不同的时间段生效不同的价格方案等。以上场景下需要有一个相对平台化的服务来满足,而不必每个项目自己做定时任务去进行轮询。解刨延迟/定时任务构成一个任务有两个要素:执行时间;执行逻辑。对任务规划者而言,并不关心任务执行逻辑...
2019-04-18 19:52:59
974
原创 rocketmq-深入消费源码
更多请移步我的博客对比看两种消费方式的实现:顺序消费与并发消费。这里对顺序消费只关注消费端,不关心producer与broker怎么处理顺序消息,假设架构及策略已保证消息的全局或者局部顺序性。通过构建假定前提,我们可以忽略本次讨论的非重点内容。以下仍以Push方式为例。消费方式宏观上看rmq自身是一个生产-消费模式,在他各个角色的具体实现中也不乏生产-消费模式的使用。DefaultMQPus...
2019-02-13 16:26:32
693
原创 rocketmq-消息重复分析
更多请移步我的博客以下介绍均假设已经初步了解rocketmq,如果还不是很清楚,可以看下我的这边博客rocketmq-半入门级架构及核心流程概览。部署结构在聊重复消费前,先大概了解下Broker的部署结构及其HA。一个master自己部署玩玩用,测试或者生产环境打算这么搞得,脑子一定上火长泡了。一个master一个slave(同步或者异步复制)测试环境可以使用,这种部署结构下...
2019-01-20 23:15:32
3044
原创 rocketmq-半入门级架构及核心流程概览
一直在用rocketmq,对他的功能和大概流程略知一些,但是比较浮,经不起稍微的推敲。是时候进一步了解下这个NB的中间件了。这里不再赘述它的那些特性,网上一大堆,这里主要按照自己想了解的一些方面作整理,贴出部分核心代码,意图通过表现各个角色间的交互,勾画大致架构,方便以后对每个要点各个深入。如果想要引导来阅读源代码,推荐rmq源码系列,写的很有诚意,本笔记中也部分参考引用其文章。部署结构(逻辑...
2018-12-14 14:32:59
803
原创 笔记-JMH(Java Microbenchmark Harness)
更多请移步我的博客看开源项目时,时不常遇到一个叫做benchmark的目录,此时脑子停滞,一眼带过,最近一次看到就顺手问了下谷大哥,发现benchmark还是个挺有意思的东西。基准测试是什么基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。例如,对计算机CPU进行浮点运算、数据访问的带宽和延迟等指标的基准测试,可以使用户清楚地...
2018-10-29 09:43:43
5019
原创 丢了眠的精神病
失眠这件事已经扰了我很久,看样子还要随我走很长时间。翻到以前失眠时随手拼凑的梦话,觉得有意思,原来失眠逼得我作文不写谎话,想起那些年为完成作文编的故事,唉!实在是对不起小明、小红等等这些素未谋面的伙伴,原谅我吧。三分自留地(2015-4-6 14:10)年后杭城的雨来的过于任性,去年回杭时同样是落雨,不过后来很快也就停了,今年不然,断续了个把月直到清明,还在淅淅沥沥的让人看不到头。周末...
2018-08-29 00:20:08
313
原创 内存伪共享测试及Java对像内存估算
引入之前每次入门Disruptor对此部分总是泛泛看过,主要关注点在如何应用上,急于按照文档完成第一个Demo,怠慢了其实现的核心思想及其要解决的主要问题,导致虽然入门过几次Disruptor,仍对其认识十分浅薄。最近有空再次入门Disruptor时,不出意外的又遇到了难以规避的问题–内存的伪共享。前车之鉴,后事之师。这次花了一些时间先去了解下久闻其名的伪共享。Java对象内存估算...
2018-08-26 21:33:48
971
原创 Dubbo源码-网络通信之提供者消费者通信
更多请移步我的博客 之前简单看过Dubbo基于SPI的“微核+插件”形式的架构模式,Dubbo因为这种架构模式使得扩展十分简单,另外Dubbo的框架分层十分清晰,看起源码来相对轻松不少。在使用Dubbo时突然想到几个问题,Dubbo默认使用tcp长链接,消费者们可能同时发起调用,提供者是怎样处理这些请求的?消费者和生产者之间链接如何复用?消费者和提供者之间几个长链接?要搞清楚这几个问题要从D...
2018-06-07 18:12:48
1197
原创 状态机选型简记
背景业务中涉及到一些关于单据的操作,每种单据单据都会有自己的状态,单据的一些行为受限于当前订单的状态,单据的状态直接用常量表示,业务进行前的检查部分通过if判断来检测当前单据是否可以流转到目标状态。痛点业务发展的比较快,某些单据状态不停的增加,每一次增加都需要改动业务中使用到状态的相关代码,更糟的的是这些代码可能遍布于多个类的多个方法中(散弹枪一样),不仅增加发布的风险也同时增加了...
2018-05-03 17:30:19
3019
翻译 设计模式-行为模式之Visitor
Visitor是行为模式的一种,允许你在不改变要操作对象类的情况下定义一个新操作。问题你的团队正在开发一款地理信息结构地图的app。图的节点不仅表示城镇也有其他诸如景点,行业等信息。节点间通过道路关联。在引擎中,每个节点都是一个对象,他们的类型由他们自己的类来表示。你接到一个任务,要把地图导出为XML。乍看之下很容易实现。你需要为每个类型的节点添加一个导出方法,然后遍历地图并为
2018-02-05 20:40:07
300
翻译 设计模式-行为模式之Template Method
Template Method 时行为模式的一种,让你定义一个算法的骨架,允许子类重新定义在不改变结构的情况下重新定义算法的某些步骤。问题假设你正在写一个挖掘办公文档数据的应用程序。用户想要输入各种格式的文件(PDF,DOC,CSV),程序输出给他们有用的格式化数据。第一个版本你仅支持DOC文件。下一个版本支持CSV格式文件。一个月后,你又增加了从PDF中分析数据的功能。这时
2018-01-30 20:47:49
265
翻译 设计模式-行为模式之Strategy
Strategy是行为模式的一种,让你定义一组算法,各自封装,并且他们可替换。Strategy让这些算法独立与使用他们的客户端。问题一天你决定写一个给驴友使用的导航应用。这个应用以漂亮的地图为中心,允许用户在任何城市快速的定位。应用最大的特点是能够自动规划路线,所以你决定特别关注这点。用户可以输入一个期望的目的地,能够快速在屏幕上画出路线。第一个版本的应用只能规划道路上的路线
2018-01-26 17:22:39
256
翻译 设计模式-行为模式之State
State是行为模式的一种,它允许你在对象内部状态发生变化时改变其行为。这个对象会改变它的类。问题状态模式和有限状态机很相似。它主要的思想是程序是几个状态之一,这些状态相互关联。状态的数量和它们之间的转换是有限的并且是预先定义的。根据当前的状态,程序对相同的事件会有不同的响应。类似的方法可以应用到对象上。比如,Document(提案)对象可以是以下三种状态之一:Draft(草
2018-01-19 17:25:41
287
翻译 设计模式-行为模式之Observer
Observer是行为模式的一种,允许你定义对象间一对多的关系,以便一个对象状态改变后,它的依赖者可以被通知并可以自动更新。问题假设你有两个对象,Customer和Store。商店采购了一批新产品,一些客户对这些产品很感兴趣。客户可能每天都来商店看下是否有感兴趣的产品售卖,但大多情况下的是无意义的,因为产品还在路上。另一方面,商店可以给所有的客户发送上新的邮件。但是对那些不关心
2018-01-15 20:45:00
298
翻译 设计模式-行为模式之Mediator
Meditor是行为模式的一种,允许你定一个对象来封装一些对象的关联关系,以使这些对象相互独立。问题你有一个对话框用来编辑用户的配置。它是由TextEdit、Checkboxes、Button等组成的表单。表单中元素会相互影响。比如,“我有一条狗”的复选框应当展示隐藏的文本框用来输入狗的名字。另外一个例子是提交按钮在保存数据钱必须娇艳所有字段的数据。吧这些逻辑直接放在表单元素代
2018-01-14 19:41:29
460
翻译 设计模式-行为模式之Iterator
Iterator是行为模式的一种,允许在不暴露底层结构的情况下顺序访问聚合对象中的元素。问题集合是编程中最常用的数据结构。它把一组对象放到一个单独的容器中。大多集合看起来都像元素的列表。然而,一些集合以树、图或者其他复杂数据结构组织数据。并且每个集合都必须提供一个方法让用户可以按照顺序处理集合中的元素。但是,要怎么顺序遍历一个复杂结构呢?必须有几个方法来做到这一点。比如,今天想
2018-01-10 17:18:04
255
翻译 设计模式-行为模式之Memento
更多请移步我的博客意图Memento是行为模式的一种,他允许你在不暴露对象内部结构的情况下捕获其内部状态,以便稍后对象可以返回到这个状态。问题假设你在写一个文本编辑器。核心逻辑放在Editor主类中。另外一些特性,像文本格式化,内联图像等,放在不同的命令类中。你决定让用户的操作变得可逆。换句话讲,要增加“撤销”功能。为了实现它,你需要在执行任何操作前保存Editor的状
2018-01-05 18:29:43
348
翻译 设计模式-行为模式之Command
Command(命令)是一种行为模式,让你可以把请求转换到单独的对象,可以用来把不同的请求参数化,排队或者记录请求,并且支持撤销操作。问题假设你在做一个新的文本编辑器。你创建了一个Button类,可以被用做工具栏的按钮,也可以用作对话框的通用按钮。这些按钮看起来很像,但是它们做不同的事情。此时我们要把针对不同按钮点击的处理代码放在哪里呢?简单的解决方法是为每个按钮创建一个But
2017-12-26 22:41:37
302
翻译 设计模式-行为模式之Chain-Of-Responsibility
责任链(Chain Of Responsibility)是一种行为模式,通过给多个对象一个机会去处理请求的的方式来避免请求发送者和接受者的耦合。责任链接收对象并且沿着链条传递它,直到一个对象来处理它。问题假设你在做一个订单系统。你第一个任务就是限制用户对系统的访问,只有已经授权的用户可以创建订单。另外,一些用户拥有管理员权限,可以访问全部的订单。你意识到这些检查必须顺序处理。程
2017-12-16 14:30:35
416
翻译 设计模式-创建模式之Singleton
Singleton是创建模式的一种,让你可以确保一个类只有一个实例,并为此实例提供一个全局访问点。问题Singleton同时解决了两个问题(违反了单一职责原则):确保一个类只有一个实例。最常见原因是控制一些共享资源,比如,数据库。假设你已经创建了一个新对象,不久,又尝试创建一个新的。在这种秦光下,你想要老的那个对象而不是新创建一个实例。它不能通过正常的构造方法完成,因为在设计
2017-11-26 11:50:59
295
翻译 设计模式-创建模式之Prototype(Clone)
Prototype(也叫做Clone)是创建型模式的一种,允许你通过复制现有的对象来生成新的对象,而不会影响现有对象的内部。问题你有一个对象并且想要创建一个副本。你该怎么做?首先,你需要创建同样class的一个新对象。然后,你必须遍历源对象的所有字段并把值拷贝到新对象中。但是这么做有一个问题。不是所有对象都可以通过这种方式被拷贝。一些对象拥有无法从外部访问的私有字段。这么做还有
2017-11-23 10:21:01
495
翻译 设计模式-创建模式之Builder
Builder是创建模式的一种,让你可以使用相同的构建过程生成不同类型和对象的表示形式。BUilder允许一步一步构建复杂对象。问题假设有一个复杂对象需要一步一步的初始化许多字段和嵌套对象。这些代码通常放在一个有很多参数的构造方法中,或者更糟糕,分散在客户端代码中。比如,让我们考虑下如何创建一个House对象。创建一个简单的房子,你需要盖四面墙,安装一个门和两个窗户,构建房顶。
2017-11-20 10:17:12
282
翻译 设计模式-创建模式之Abstract Factory
Abstract Factory是创建模式的一种,让你在没有指定具体类的情况下生产相关对象的系列。问题假设你在写一个家具店的模拟器。你的代码由以下构成:相关产品的系列,像:Chair + Sofa + CoffeeTable。系列的几个变种。比如,产品Chair + Sofa + Coffee + CoffeeTable可以有这些变种:IKEA,VictorianSty
2017-11-15 19:49:07
302
翻译 设计模式-创建模式之Factory Method
Factory Method是创建模式的一种,他在父类中提供一个用来创建对象的接口,但是允许子类修改创建对象的类型。问题假设你有一个后勤管理应用。应用的第一个版本只需要处理卡车这种运输方式,所以,你有一个Truck类。不久,你的应用很受欢迎,你收到了许多需求,包括水运。好消息,不是吗?但是你的代码怎么样呢?看起来,你的代码有许多地方要和Truck类耦合。添加Ship类需要改
2017-11-14 16:02:05
323
原创 设计模式-结构模式之小结
结构设计模式使的我们简单快速的建立类的层级及不同类之间的关系,明确不同层级间的责任和边界,让各个模块、系统间相互独立并很好的协作。概览Adapter模式适配器的目的是使不兼容接口间的可正常进行协作,它允许我们新增接口。主要用来解决下面两个问题:接口间输入输出不匹配的问题,适配器在无法相互直接使用的接口间加入中间转换层,对数据格式进行转换,使接口间可以顺利协作。当你需要复
2017-11-03 14:59:58
508
翻译 译-设计模式-结构模式之Flyweight
Flyweight是结构模式的一种,通过在多个对象见共享对象状态的通用部分而不是让各个对象独自持有的方式来让你在可用的RAM中装入更多的对象。问题在长时间工作后想要找些乐趣,你决定写一个简单的视频游戏。玩家能够在地图上移动并且可以相互射击。你决定实现一个真实的粒子系统并让它称为这个游戏的特性。子弹,导弹和爆炸产生的碎片应该到处飞舞并且能够给玩家分配经验。过了一会,你最后一次
2017-11-02 11:08:55
323
翻译 译-设计模式-结构模式之Proxy
Proxy是结构模式的一种,它能够让你为另外一个对象提供一个替身或者占位符来控制对它的访问。问题为什么要控制对对象的访问?比如:你有一个需要消耗大量系统资源的对象。你时不时会用到它,但不是一直使用。因此,这个对象不用再程序启动时创建,而是当真正需要它的时候再创建。每个用到这个对象的客户端可能都有一些延迟实例化代码。显而易见,它导致了大量重复代码。理想状态下,我们可以直接在对
2017-10-27 17:51:02
579
翻译 设计模式-结构模式之Facade
Facade是结构模式的一种,它让你可以为一个复杂的系统,类库或者框架提供一个简单的接口。问题想象一下,代码必须和一大堆复杂的框架或者类库协作。你必须手动实力话这些对象,跟踪依赖,正确的顺序关系等等。最后,你的业务逻辑类会和第三方类库的实现紧密耦合。这些代码难以理解和维护。解决门面是一个类,它为一个包含很多类的复杂子系统提供一个简单的接口。相对直接调用子系统而言,门面提供有
2017-10-25 20:40:48
352
翻译 设计模式-结构模式之Composite
Composite是结构设计模式的一种,允许你像树一样组合对象,并且允许客户端像单个对象一样和这些结构协作。问题Composite模式只有在你的业务模型可以被表示为一个树结构时才有意义。比如,你有两个对象:Product和Box。这个Box可以包含几个Product和一些更小的Box。这些更小的Box也可以包含一些Product或者更小的Box等等。现在,想象你的Produ
2017-10-21 13:37:18
354
翻译 译-设计模式-结构模式之Bridge
目的Bridge是结构模式的一种,它可以帮你分离一个巨大的类或者将一组关系相近的类分离成为两个独立的层次结构,抽象和实现,可以各自独立开发。问题抽象?实现?听起来害怕?我们首先来看个简单的例子。你有一个几何Shap类,他有一对子类:Square和Triangle。你希望扩展这个层次结构来融入颜色以便创建红色和蓝色的形状。但是因为你已经有子类,你需要创建4个类来组合,比如BlueSquare和RedT
2017-10-18 19:51:16
347
翻译 译-设计模式-结构模式之Decorator
Decorator(装饰器)是一个结构设计模式,可以让你在封装包涵对象原有行为的基础上增加新的行为。问题你需要动态的添加或者移除一个对象的责任,但是你要做到和应用中其他代码的兼容。当你需要扩展一个类的行为时继承时第一个想到的处理方式。然而,继承是静态的。你不能够增
2017-09-24 17:50:06
417
翻译 译-设计模式-结构模式之Adapter
adapter目的适配器是一种结构设计模式,使得不兼容接口间的可正常进行协作。问题想象你有一个使用XML作为数据处理格式的APP,但你用到了一个仅支持JSON数据格式的类库。举个例子,你有一个做股票数据的APP。他从多个数据源获取XML来展示成图标。在一个新版本中,你决定使用一些三方的分析包。但是有一个问题
2017-09-18 21:35:35
555
原创 了解ClassLoader
每个Java类都维护着一个指向定义它的类加载器的引用,通过getClassLoader()方法就可以获取到此引用。通过调用getParent()方法可以得到加载器的父类,上述代码输出中,AppClassLoader对应系统类加载器(system class loader);ExtClassLoader对应扩展类加载器(extensions class loader);需要注意的是这里并没有输出引导类加载器,这是因为有
2017-07-06 11:41:28
688
翻译 译-Spring-理解AOP代理
更多请移步: 我的博客引入之前写过一篇关于Spring代理流程的博客,当时没有深入思考,最近碰到一个有趣的事情,类内部调用带有spring注解,但注解不生效的问题,@Transaction不生效
2017-06-29 15:59:36
384
转载 Servlet3-异步请求
更多请移步: 我的博客第22章 异步请求Servlet3.0规范新增了对异步请求的支持,Spring MVC也在此基础上对异步请求提供了方便。异步请求是在处理比较耗时的业务时先将request返回,然后另起线程处理耗时的业务,处理完后再返回给用户。异步请求可以给我们带来很多方便,最直接的用法就是处理耗时的业务,比如,需要查询数据库、需要调用别的服务器来处理等情况下可以先将请求返回给客户端,然后启用新
2017-06-13 16:00:03
1967
翻译 (译)JVM Concurrent Mark Sweep (CMS) Collector 1.8
更多请移步: 我的博客原文链接:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.htmlThe Concurrent Mark Sweep (CMS) collector is designed for applications that prefer shorter garbage collection
2017-05-24 16:00:54
2016
1
原创 JDK源码 Hash杂记
最早了解Hash的用法,是一次分表的经历,公司用户表数据有几千万,查询的效率已经比较低了,需要做拆分处理,之前系统中已经有分表的数据,处理方式比较简单,没有使用中间件,按照商家的ID(32位字符串)做Hash然后取模,算出其落在表的编号,然后加上前缀得到最终表名。最近在了解zk分布式锁时,为了避免一种实现方式的羊群效应,其改进思路类似一致性哈希算法。于是,便看了下Hash相关的知识,并用Java做了
2017-05-14 18:27:41
267
原创 JDK源码 Java Reference
JDK源码 java的四种Reference之前探讨过一次JAVA的FinalReference,这次我们来看下java.lang.ref包下对应的其他三种引用。走近引用Reference和ReferenceQueue在使用中一定是结伴出现的,当一个Reference确定要被GC回收,GC便会把Reference加入到与之关联的ReferenceQueue中。注意:在Reference的构造方法中,
2017-04-24 23:10:38
400
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人