- 博客(169)
- 资源 (3)
- 收藏
- 关注

原创 RocketMQ 源码阅读 ---- 消息消费(普通消息)
RocketMQ Consumer 消费拉取的消息的方式有两种1.Push方式:rocketmq 已经提供了很全面的实现,consumer 通过长轮询拉取消息后回调 MessageListener 接口实现完成消费,应用系统只要重写 MessageListener的方法完成业务逻辑即可2.Pull方式:完全由业务系统去控制,定时拉取消息,指定队列消费等等,当然这里需要业务系统去根据自己的业务需求去实现下面介绍 push 方式(long-polling长轮询方式实...
2020-06-09 21:12:45
943

原创 RocketMQ 源码阅读 ---- 消息存储(普通消息)
零、关键词解释cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到**加快访问速度**的作用。buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以**减少响应次数**(比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,不然硬盘都要被你玩坏了)。 --知乎数据复制:当我们在某段代码中往某个文件写入一段字符串的时候,实际发生了什么呢?数据从 Application Memo...
2020-06-09 21:10:28
670

原创 RocketMQ 源码阅读 ---- Tag 过滤
零、简介RocketMQ 消息过滤分成 TAG过滤和 SQL Filter 过滤,SQL Filter是在服务端处理,会影响 MQ 的性能一般不建议使用,语法比较灵活,实现方式也相对复杂一些。Tags 过滤实现比较简单,在客户端实现。这样就有一个问题,如果某个 TOPIC 消息非常多,主要消费这个 TOPIC 应用A要是 500 台,另一个只想消费部分 Tag 消息的应用B只有 2 台,500...
2019-10-11 14:53:45
658

原创 自底向上和自顶向下的架构设计区别
某日小明上数学课,他的老师给了很多个不同的直角三角板让小明用尺子去量三角板的三个边,并将长度记录下来。两个小时过去,小明完成任务,把数据拿给老师。老师给他说,还有一个任务就是观察三条边之间的数量关系。又是两个小时,聪明的小明连蹦带跳走进了办公室,说:“老师,我找到了,三条边之中有两条,它们的平方和约等于另外一条的平方。”老师拍拍小明的头,“你今天学会了一个定理,勾股定理。它就是说直角三角形有两边平...
2019-07-09 18:48:09
30722
5

原创 RocketMQ 源码阅读 ---- 顺序消息
一、概述顺序消息的大致原理是发送的时候,比如同一个订单 id 的发送到同一个 queueId 中,如下单、支付、扣库存这个流程需要保证同一个订单 id 消息有序才能正常执行。在消费的时候,也只能有一个 consumer 并且单线程从这个 queue 中消费,这样才能保证消息消费顺序。 二、源码解析在顺序消息的 produer 中,需要有一个选择队列的算法,来确定某个规则下的消息...
2018-09-04 21:44:35
859

原创 RocketMQ 源码阅读 ---- 延时消息
一、概念解析定时消息:在某个时间点投递消息,比如 2018-07-09 00:00:00 投递消息延时消息:在过了多少时间后,投递消息,比如 10 秒后投递消息(开源版本的 RocketMQ 只提供固定几个时间点的延时消息) 二、测试用例package org.apache.rocketmq.example.quickstart;import org.apache.roc...
2018-08-24 17:41:29
1171
1

原创 谈谈 Memcached LRU
Memcached 还有大量空闲空间,却发生 LRU,到底是什么原因导致的?从内存的结构,从内存的分配,来看懂为什么...
2016-06-21 15:24:39
3148

原创 JVM 调优 —— 新生代 Survivor 空间不足
零. 新生代调优规律增大新生代空间, Minor GC 频率减少, Minor GC 时间上升。 减少新生代空间, Minor GC 频率上升, Minor GC 时间下降一. 新生代典型问题先看一段 GC 日志:新生代使用 ParNew, 老年代使用 CMS {Heap before GC invocations=0 (full 0): par new gene
2016-03-14 23:15:18
14661
2
原创 JDK 源码分析 -- LongAdder
一、简介当多个线程更新用于诸如收集统计信息(因为LongAdder 多线程时候会有误差)而不是用于细粒度同步控制之类的公共和时,此类通常比AtomicLong更可取。在低更新争用下,这两个类具有相似的特征。但是在竞争激烈的情况下,此类的预期吞吐量会大大提高,但要消耗更多的空间。LongAdders可以与java.util.concurrent.ConcurrentHashMap一起使用,以维护可扩展的频率图(一种直方图或多集合形式)。例如,要将计数添加到ConcurrentHashMap &l...
2020-07-08 15:52:27
450
原创 App端上交互架构设计思考
零、背景考虑下手机App业务和底层电商商业化服务端交互要有什么样的设计原则和架构思考。技术架构角度,尽量减少不必要请求交互,降低耦合 业务架构角度,业务内核聚焦,减少上游感知底层[商业化]业务一、架构对比左图架构问题,端上点击之后要多经过一层业务服务端(技术架构问题),响应RT增加,而且各种业务要去感知底层商业化的存在,业务和商业化耦合(业务架构问题)右图解决了左图...
2020-04-27 16:16:12
623
原创 SimpleDateFormat 线程不安全问题及解决方案
零、概述任何线程不安全的问题,其实本质就是共用了一份数据且没有进行加锁同步,SimpleDateFormat 也是一样。一、错误案例public class Test { static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(St...
2020-01-08 14:57:31
1163
1
原创 最佳线程数实战
对于计算密集型任务,在拥有 N个核的 CPU 的系统上,当线程池大小为 N+1 时,通常能实现最优的利用率,(即当计算密集型任务偶尔由于页缺失故障或者其他原因而暂停时,这个额外的现线程也能够确保CPU的时钟周期不会被浪费)对于IO密集型任务,Java 并发编程实战中有一个公式:Ncpu = number of CPUsUcpu = target CPU utilization, ...
2019-11-25 17:26:22
350
原创 MySQL 如何解决深度翻页
select * from table_a limit m,n;MySQL的 limit m,n 工作原理就是先读取符合where条件的前面m+n条记录,然后抛弃前m条,返回后面n条,所以m越大,偏移量越大,性能就越差。这也是大部分ORM框架生成的分页sql。那么如何优化呢?如果 id 是简单的数字,可以这么优化select * from table_a where id &g...
2019-10-18 17:12:46
3437
原创 性能优化 ---- 如何排查线上性能问题
零. 概述又到了一年一度某电商帝国双十一大促备战阶段,今年我负责稳定性这块,系统压测找出性能瓶颈就是其中之一的工作。在压测某个系统 A,线上集群发现 CPU 使用率 50%,8C-16G-200G 的容器 load 达到 13 左右,吓得立刻下掉了压测流量。然后在预发环境单机压测寻找性能瓶颈,废话不多说,下面开始分析步骤。一. 性能问题排查压测预发环境 单机 8C-16G-200...
2019-10-12 18:16:54
1029
1
原创 Mysql 执行计划实战
一、概念解析执行计划大多数人都听过,都用来做 MySQL 性能优化的辅助工具,以下先针对各个执行计划的字段进行解释1、id (JSON name : select_id)select 唯一标识。它是在SELECT查询中的顺序编号。如果这一行表示其他行的union结果,这个值可以为空。在这种情况下,table列会显示为形如<union M,N>,表示它是id为M和N的查询行的联合...
2019-08-08 17:12:54
360
原创 性能优化 ---- 避免使用 BeanUtils copy
一、背景在开发过程中,我们经常会遇到对象的转换,比如外部的 DTO 对象转换为内部的 DO 对象,这里面很多字段名都是相等的,要是一个一个去 get/set 很多人会觉得很烦,于是为了方便和代码的简介大家不约而同地找到了 UtilsBean.copy 相关的对象属性copy工具包。当我们系统还只是 QPS 几十上百时,可能我们对系统的性能优化还不用到这么细致,当我们的系统 QPS/TPS ...
2019-07-25 14:55:25
3808
1
原创 MQ 重试队列注意事项
不要过度依赖消息队列的重试来保证最终消费成功举个例子,我们的消费消息队列的应用A依赖于应用B的某个接口,但是双十一流量太大,应用B的接口QPS不足,导致RPC超时返回(即本条消息消费失败),此条消息会进入重试队列。进入重试队列不是万能的问题一:RocketMQ重试16次还是不成功就会认为消息消费不了,丢进死信队列问题二:RocketMQ重试队列数量少,可能100个正常的queue才1...
2019-07-23 18:05:27
1687
原创 Java 源码解析 ---- ExecutorCompletionService
一、具体例子先使用三种方法比较并发结果异同:方法一:提交后等待 future 结果返回方法二:自己维护一个Collection保存submit方法返回的Future,然后在主线程中遍历这个Collection并调用Future的get()方法取到线程的返回值。方法三:使用CompletionService类,它整合了Executor和BlockingQueue的功能。你可以将Call...
2019-05-10 20:34:50
500
原创 MySQL in 语句里面到底是串行还是并行
场景:select * from XXX where id in(id_1, id_2, id_3)分表后,分库分表中间件会把相同分库的不同分表的查询用 union 来一步返回,减少网络rt次数。select * from 分库1 where id in(id_1, id_3) union select * from 分库1where id in(id_2) 的子查询是串行,考虑到分表数...
2019-04-23 14:46:19
634
原创 MySQL 使用 OR 条件导致索引失效
原来的 SQL:能走到索引SELECT count(1)FROM XXXWHERE 1 = 1 AND( (3_id = 12345) OR (4_id = 12345));很多人都喜欢用 OR 去解决,虽然语句简单,但是就会发生下面的场景,容易走不到索引新需求导致改造SQL为: 走不到索引SELECT count(1)FROM XXXWHERE 1...
2019-04-23 14:36:23
29863
9
原创 MySQL UNION 的两个子查询是串行还是并行
问题:select_1 UNION select_2,其中 UNION 左右的两个子查询是否并行。场景:由于我们的分库分表中间件对库内表的子查询会进行 union,而我们是 2048 分表,也就是最大可能 union 2048次,如果是串行执行,结果是我们不能接受的测试结果mysql> select version();+---------------+| version() ...
2019-04-16 11:22:34
2577
原创 MySQL 写优化 关于 innodb_flush_log_at_trx_commit 和 sync_binlog
Beta 机器测试,写入性能较差,有 4ms+,于是与DB共同排查,确实是分库DB写入太慢,DB 调整了两个参数后,RT 下降到均值 2ms。是什么参数如此给力? 这样调整后,32C-96G-1000G 单库峰值 TPS = 2.6W,QPS = 1.1W具体操作是,innodb_flush_log_at_trx_commit 从1改为2,sync_binlog 从1改为 10000 ,前者是...
2019-04-12 23:54:37
1728
原创 MySQL 主键冲突异常如何全部捕获?
很多时候只要觉得捕获 DuplicateKeyException 就行,其实这样还不够,底层还会抛出其他异常类型,完整的捕获如下:public void method() {try { result = dao.insert(shopkeeperIndexDO); } catch (DuplicateKey...
2019-03-29 11:45:17
8721
1
原创 RocketMQ 源码阅读 -- 环境搭建
一、 NameServer 和 Broker 启动根据官网的 quik start 指引,我们可以看到在 distribution/bin 目录下的 mqnamesrv 和 mqbroker 是启动的关键。例如 mqnamesrv #!/bin/sh# Licensed to the Apache Software Foundation (ASF) under one or more# c...
2018-07-02 15:44:26
719
原创 Spring 源码阅读 -- 事务
Spring 事务就是把 JDBC 模板化的代码封装好,本质上还是1. 开启事务2. 业务逻辑(JDBC 操作)3. commit/rollback4. 资源释放(数据库连接)Spring 帮助我们做了上述1,3,4三步(第 2 步是我们的业务代码)下面是我读事务这块的源码整理的思维导图:源码写了一堆,实际上还是绕不过开始事务,提交事务,回滚事务三件事,只是这三件事情现在由 Spring 把这些模...
2018-05-20 17:20:48
299
原创 ZooKeeper 使用中的问题:Len error
一. 问题现场: 一天夜里,一台服务器的 zk client 与 server 断开,一般情况下程序写好了自动重连会自动重连成功,但是这一次,怎么重连都连不上了。 client 端日志如下:就是不停地重连,但是连不上,看日志像是服务端挂了,但是其他 client 确好好地,说明服务端没挂2017-10-07 23:59:44.466 [DEBUG] [org.apa
2017-10-28 17:09:38
19312
原创 ZooKeeper 概述
ZooKeeper: 一个分布式应用的分布式协调服务ZooKeeper (下面简称 ZK)是一个分布式应用的分布式的、开源的协调服务。ZK 提供一系列原语使得分布式应用可以诸如同步、配置维护、分组和命名等高层次服务。它运行在 Java 环境。协调服务不好写正确。经常发生的错误有竞态条件和死锁。有了 ZK 就不需要自己从头开始实现协调服务。设计目标ZK 简洁。
2017-08-19 14:15:08
965
原创 Redis Cluster 简介与部署
一. Redis Cluster 简介需要 3.0 及以后版本才能支持 clusterRedis Cluster 带来的优势使用 redis cluster 安装后,数据会自动分片到多个 redis 节点(如果使用 sentinel 则需要自己实现分片算法)个别节点宕机,其他节点还能继续正常运行Redis Cluster TCP 端口每个Re
2017-06-27 15:51:15
1278
原创 JDK 源码解析 —— ThreadLocal
零. 简介这个类提供本地线程变量。不同于一般的变量,这些变量在他们各自的线程里通过 get、set 访问一个它自己的变量,这是一个独立初始化的变量副本。在一个类中,ThreadLocal 实例一般是 private static 的,期望和一个线程关联状态(如 userId,transactionId 等)。简单地说,就是此类提供了线程的本地变量,线程修改本地变量不互相影响。举个例
2017-03-17 17:23:37
5496
2
原创 SPI(service provider interface 服务提供者接口)
SPI 平时写代码一般不会用到,但是到了做一些基础组件开发或者是中间件开发的时候,SPI 是一个必须要掌握的知识点...
2017-02-14 16:22:02
2993
原创 Spring 源码解析 ---- 事件监听
一. 测试用例package main.java.com.wenniuwuren.spring.event.listener;import org.springframework.context.ApplicationEvent;/** * 定义监听事件 * Created by hzzhuyibin on 2016/11/22. */public class TestEve
2016-11-23 10:08:48
1478
原创 Spring 源码解析 ---- 自定义标签
零. 阅读准备读这篇文章前先看下预备知识:Spring 自定义标签一. 代码阅读自定义标签解析核心代码:public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) { String namespaceUri = getNamespaceURI(ele);
2016-11-15 20:21:12
1072
原创 Spring 自定义标签
扩展自定义标签步骤(前提要把 Spring Core 包加入项目):创建一个需要扩展的组件定义一个 XSD 文件描述组件内容创建一个文件,实现 BeanDefinitionParse 接口,用来解析 XSD 文件中的定义和组件定义创建一个 Handler 文件,扩展自 NamespaceHandlerSupport,目的是将组件注册到 Spring 容器编写 Spring.handlers
2016-11-15 15:23:12
1360
翻译 MongoDB 简介
一. 概述MongoDB 是一个开源的文档数据库,提供了高性能、高可用和自动分片特性。二. 文档数据库在 MongoDB 中一条记录就是一个文档,就是一个键值对数据结构。MongoDB 文档和 JSON 对象相似。值可以包含其他文档、数组和数组文档。使用文档的优点:文档(即对象)对应于许多编程语言中的原生数据类型值中还能包含文档和数组可以减少 J
2016-10-27 15:06:12
1030
翻译 MongoDB 分片键
本文介绍了 MongoDB 在做分片时候对 Shard Key 的选择,当然这也适用于其他数据库的分片,要优化数据库性能,本文会给你一定的启发..
2016-10-27 14:02:29
9914
1
原创 LeetCode ---- Find the Difference (Java/Lua 实现)
题目:Given two strings s and t which consist of only lowercase letters.String t is generated by random shuffling string s and then add one more letter at a random position.Find the lette
2016-10-24 13:43:34
1196
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人