自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RocketMQ 源码阅读 ---- 消息消费(普通消息)

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

2020-06-09 21:12:45 756

原创 RocketMQ 源码阅读 ---- 消息存储(普通消息)

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

2020-06-09 21:10:28 475

原创 RocketMQ 源码阅读 ---- Tag 过滤

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

2019-10-11 14:53:45 600

原创 自底向上和自顶向下的架构设计区别

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

2019-07-09 18:48:09 30218 6

原创 RocketMQ 源码阅读 ---- 顺序消息

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

2018-09-04 21:44:35 725

原创 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 1109 1

原创 Elastic-Job-Lite 源码阅读 ---- 作业执行

当当网开源分布式弹性调度框架源码分析...

2017-11-07 21:11:57 1823

原创 Elastic-Job-Lite 源码阅读 ---- 任务初始化

ZooKeeper + Quartz 为整体技术选型的分布式调度服务

2017-11-06 20:25:47 2223

原创 谈谈 Memcached LRU

Memcached 还有大量空闲空间,却发生 LRU,到底是什么原因导致的?从内存的结构,从内存的分配,来看懂为什么...

2016-06-21 15:24:39 3087

原创 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 14308 2

原创 JDK 源码分析 -- LongAdder

一、简介当多个线程更新用于诸如收集统计信息(因为LongAdder 多线程时候会有误差)而不是用于细粒度同步控制之类的公共和时,此类通常比AtomicLong更可取。在低更新争用下,这两个类具有相似的特征。但是在竞争激烈的情况下,此类的预期吞吐量会大大提高,但要消耗更多的空间。LongAdders可以与java.util.concurrent.ConcurrentHashMap一起使用,以维护可扩展的频率图(一种直方图或多集合形式)。例如,要将计数添加到ConcurrentHashMap &l...

2020-07-08 15:52:27 376

原创 App端上交互架构设计思考

零、背景考虑下手机App业务和底层电商商业化服务端交互要有什么样的设计原则和架构思考。技术架构角度,尽量减少不必要请求交互,降低耦合 业务架构角度,业务内核聚焦,减少上游感知底层[商业化]业务一、架构对比左图架构问题,端上点击之后要多经过一层业务服务端(技术架构问题),响应RT增加,而且各种业务要去感知底层商业化的存在,业务和商业化耦合(业务架构问题)右图解决了左图...

2020-04-27 16:16:12 554

原创 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 976 1

原创 最佳线程数实战

对于计算密集型任务,在拥有 N个核的 CPU 的系统上,当线程池大小为 N+1 时,通常能实现最优的利用率,(即当计算密集型任务偶尔由于页缺失故障或者其他原因而暂停时,这个额外的现线程也能够确保CPU的时钟周期不会被浪费)对于IO密集型任务,Java 并发编程实战中有一个公式:Ncpu = number of CPUsUcpu = target CPU utilization, ...

2019-11-25 17:26:22 290

原创 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 3291

原创 性能优化 ---- 如何排查线上性能问题

零. 概述又到了一年一度某电商帝国双十一大促备战阶段,今年我负责稳定性这块,系统压测找出性能瓶颈就是其中之一的工作。在压测某个系统 A,线上集群发现 CPU 使用率 50%,8C-16G-200G 的容器 load 达到 13 左右,吓得立刻下掉了压测流量。然后在预发环境单机压测寻找性能瓶颈,废话不多说,下面开始分析步骤。一. 性能问题排查压测预发环境 单机 8C-16G-200...

2019-10-12 18:16:54 938 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 306

原创 性能优化 ---- 避免使用 BeanUtils copy

一、背景在开发过程中,我们经常会遇到对象的转换,比如外部的 DTO 对象转换为内部的 DO 对象,这里面很多字段名都是相等的,要是一个一个去 get/set 很多人会觉得很烦,于是为了方便和代码的简介大家不约而同地找到了 UtilsBean.copy 相关的对象属性copy工具包。当我们系统还只是 QPS 几十上百时,可能我们对系统的性能优化还不用到这么细致,当我们的系统 QPS/TPS ...

2019-07-25 14:55:25 3576 1

原创 MQ 重试队列注意事项

不要过度依赖消息队列的重试来保证最终消费成功举个例子,我们的消费消息队列的应用A依赖于应用B的某个接口,但是双十一流量太大,应用B的接口QPS不足,导致RPC超时返回(即本条消息消费失败),此条消息会进入重试队列。进入重试队列不是万能的问题一:RocketMQ重试16次还是不成功就会认为消息消费不了,丢进死信队列问题二:RocketMQ重试队列数量少,可能100个正常的queue才1...

2019-07-23 18:05:27 1609

原创 Java 源码解析 ---- ExecutorCompletionService

一、具体例子先使用三种方法比较并发结果异同:方法一:提交后等待 future 结果返回方法二:自己维护一个Collection保存submit方法返回的Future,然后在主线程中遍历这个Collection并调用Future的get()方法取到线程的返回值。方法三:使用CompletionService类,它整合了Executor和BlockingQueue的功能。你可以将Call...

2019-05-10 20:34:50 448

原创 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 568

原创 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 29100 9

原创 MySQL UNION 的两个子查询是串行还是并行

问题:select_1 UNION select_2,其中 UNION 左右的两个子查询是否并行。场景:由于我们的分库分表中间件对库内表的子查询会进行 union,而我们是 2048 分表,也就是最大可能 union 2048次,如果是串行执行,结果是我们不能接受的测试结果mysql> select version();+---------------+| version() ...

2019-04-16 11:22:34 2375

原创 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 1622

原创 MySQL 主键冲突异常如何全部捕获?

很多时候只要觉得捕获 DuplicateKeyException 就行,其实这样还不够,底层还会抛出其他异常类型,完整的捕获如下:public void method() {try { result = dao.insert(shopkeeperIndexDO); } catch (DuplicateKey...

2019-03-29 11:45:17 8212 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 676

原创 Spring 源码阅读 -- 事务

Spring 事务就是把 JDBC 模板化的代码封装好,本质上还是1. 开启事务2. 业务逻辑(JDBC 操作)3. commit/rollback4. 资源释放(数据库连接)Spring 帮助我们做了上述1,3,4三步(第 2 步是我们的业务代码)下面是我读事务这块的源码整理的思维导图:源码写了一堆,实际上还是绕不过开始事务,提交事务,回滚事务三件事,只是这三件事情现在由 Spring 把这些模...

2018-05-20 17:20:48 248

原创 ZooKeeper 使用中的问题:Len error

一. 问题现场:    一天夜里,一台服务器的 zk client 与 server 断开,一般情况下程序写好了自动重连会自动重连成功,但是这一次,怎么重连都连不上了。    client 端日志如下:就是不停地重连,但是连不上,看日志像是服务端挂了,但是其他 client 确好好地,说明服务端没挂2017-10-07 23:59:44.466 [DEBUG] [org.apa

2017-10-28 17:09:38 18781

原创 ZooKeeper Watch 回调事件丢失

使用 ZooKeeper 需要注意的问题,没有理解的话,很容易踩坑

2017-09-27 20:31:02 4006 3

原创 ZooKeeper 概述

ZooKeeper: 一个分布式应用的分布式协调服务ZooKeeper (下面简称 ZK)是一个分布式应用的分布式的、开源的协调服务。ZK 提供一系列原语使得分布式应用可以诸如同步、配置维护、分组和命名等高层次服务。它运行在 Java 环境。协调服务不好写正确。经常发生的错误有竞态条件和死锁。有了 ZK 就不需要自己从头开始实现协调服务。设计目标ZK 简洁。

2017-08-19 14:15:08 690

原创 Redis Cluster 简介与部署

一. Redis Cluster 简介需要 3.0 及以后版本才能支持 clusterRedis Cluster 带来的优势使用 redis cluster 安装后,数据会自动分片到多个 redis 节点(如果使用 sentinel 则需要自己实现分片算法)个别节点宕机,其他节点还能继续正常运行Redis Cluster TCP 端口每个Re

2017-06-27 15:51:15 1217

原创 JDK 源码解析 —— ThreadLocal

零. 简介这个类提供本地线程变量。不同于一般的变量,这些变量在他们各自的线程里通过 get、set 访问一个它自己的变量,这是一个独立初始化的变量副本。在一个类中,ThreadLocal 实例一般是 private static 的,期望和一个线程关联状态(如 userId,transactionId 等)。简单地说,就是此类提供了线程的本地变量,线程修改本地变量不互相影响。举个例

2017-03-17 17:23:37 5416 2

原创 SPI(service provider interface 服务提供者接口)

SPI 平时写代码一般不会用到,但是到了做一些基础组件开发或者是中间件开发的时候,SPI 是一个必须要掌握的知识点...

2017-02-14 16:22:02 2919

原创 MongoDB 高可用分片配置(Windows、Linux)

MongoDB 最简易的高可用分片搭建..

2017-01-18 15:28:54 629

原创 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 1428

原创 Spring 源码解析 ---- 自定义标签

零. 阅读准备读这篇文章前先看下预备知识:Spring 自定义标签一. 代码阅读自定义标签解析核心代码:public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) { String namespaceUri = getNamespaceURI(ele);

2016-11-15 20:21:12 1013 2

原创 Spring 自定义标签

扩展自定义标签步骤(前提要把 Spring Core 包加入项目):创建一个需要扩展的组件定义一个 XSD 文件描述组件内容创建一个文件,实现 BeanDefinitionParse 接口,用来解析 XSD 文件中的定义和组件定义创建一个 Handler 文件,扩展自 NamespaceHandlerSupport,目的是将组件注册到 Spring 容器编写 Spring.handlers

2016-11-15 15:23:12 1288

翻译 MongoDB 简介

一. 概述MongoDB 是一个开源的文档数据库,提供了高性能、高可用和自动分片特性。二. 文档数据库在 MongoDB 中一条记录就是一个文档,就是一个键值对数据结构。MongoDB 文档和 JSON 对象相似。值可以包含其他文档、数组和数组文档。使用文档的优点:文档(即对象)对应于许多编程语言中的原生数据类型值中还能包含文档和数组可以减少 J

2016-10-27 15:06:12 993

翻译 MongoDB 分片键

本文介绍了 MongoDB 在做分片时候对 Shard Key 的选择,当然这也适用于其他数据库的分片,要优化数据库性能,本文会给你一定的启发..

2016-10-27 14:02:29 9707 2

原创 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 1153

秒杀系统架构

阿里巴巴的秒杀分享,对于想做秒杀系统或者想了解秒杀系统的人来说都是一个不错的资源

2017-01-23

javamail的Jar包

java mail 1.4.7Jar包... 配合博客代码可以直接使用

2014-12-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除