自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

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

一、概述 顺序消息的大致原理是发送的时候,比如同一个订单 id 的发送到同一个 queueId 中,如下单、支付、扣库存这个流程需要保证同一个订单 id 消息有序才能正常执行。 在消费的时候,也只能有一个 consumer 并且单线程从这个 queue 中消费,这样才能保证消息消费顺序。  ...

2018-09-04 21:44:35 329 0

原创 RocketMQ 源码阅读 ---- 延时消息

一、概念解析 定时消息:在某个时间点投递消息,比如 2018-07-09 00:00:00 投递消息 延时消息:在过了多少时间后,投递消息,比如 10 秒后投递消息(开源版本的 RocketMQ 只提供固定几个时间点的延时消息)   二、测试用例 package org.apache....

2018-08-24 17:41:29 657 1

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

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

2017-11-07 21:11:57 1530 0

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

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

2017-11-06 20:25:47 1803 0

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

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

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

原创 谈谈 Memcached LRU

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

2016-06-21 15:24:39 2695 0

原创 JVM 调优 —— 新生代 Survivor 空间不足

零. 新生代调优规律 增大新生代空间, Minor GC 频率减少, Minor GC 时间上升。 减少新生代空间, Minor GC 频率上升, Minor GC 时间下降 一. 新生代典型问题 先看一段 GC 日志:新生代使用 ParNew, 老年代使用 CMS  {H...

2016-03-14 23:15:18 8618 1

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

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

2020-04-27 16:16:12 163 0

原创 高效 linux 脚本 ---- 取出文件可变参数赋值到执行脚本和 AWK 实战

将文件中每一行内容填充进要执行的脚本中 nohup cat /home/admin/XXX/logs/tradeIdList.log.2019-04-28 | xargs -i curl 'localhost:7001/compare/compareData.htm?tbTrade...

2020-02-28 10:56:38 50 0

原创 SimpleDateFormat 线程不安全问题及解决方案

零、概述 任何线程不安全的问题,其实本质就是共用了一份数据且没有进行加锁同步,SimpleDateFormat 也是一样。 一、错误案例 public class Test { static DateFormat df = new SimpleDateFormat("...

2020-01-08 14:57:31 68 0

原创 最佳线程数实战

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

2019-11-25 17:26:22 76 0

原创 MySQL 如何解决深度翻页

select * from table_a limit m,n; MySQL的 limit m,n 工作原理就是先读取符合where条件的前面m+n条记录,然后抛弃前m条,返回后面n条,所以m越大,偏移量越大,性能就越差。这也是大部分ORM框架生成的分页sql。 那么如何优化呢? 如果 id...

2019-10-18 17:12:46 535 0

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

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

2019-10-12 18:16:54 78 0

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

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

2019-10-11 14:53:45 77 0

原创 Mysql 执行计划实战

一、概念解析 执行计划大多数人都听过,都用来做 MySQL 性能优化的辅助工具,以下先针对各个执行计划的字段进行解释 1、id (JSON name : select_id) select 唯一标识。它是在SELECT查询中的顺序编号。如果这一行表示其他行的union结果,这个值可以为空。在这种...

2019-08-08 17:12:54 108 0

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

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

2019-07-25 14:55:25 1266 0

原创 MQ 重试队列注意事项

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

2019-07-23 18:05:27 417 0

原创 自底向上和自顶向下的区别

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

2019-07-09 18:48:09 9273 3

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

一、具体例子 先使用三种方法比较并发结果异同: 方法一:提交后等待 future 结果返回 方法二:自己维护一个Collection保存submit方法返回的Future,然后在主线程中遍历这个Collection并调用Future的get()方法取到线程的返回值。 方法三:使用Comple...

2019-05-10 20:34:50 202 0

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

2019-04-23 14:46:19 173 0

原创 MySQL 使用 OR 条件导致索引失效

原来的 SQL:能走到索引 SELECT count(1) FROM XXX WHERE 1 = 1 AND ( (3_id = 12345) OR (4_id = 12345) ); 很多人都喜欢用 OR 去解决,虽然语句简单,但是就会发生下面的场景,容易走不到索引 新需...

2019-04-23 14:36:23 6460 0

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

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

2019-04-16 11:22:34 505 0

原创 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_...

2019-04-12 23:54:37 590 0

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

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

2019-03-29 11:45:17 2477 0

原创 RocketMQ 源码阅读 -- 环境搭建

一、 NameServer 和 Broker 启动根据官网的 quik start 指引,我们可以看到在 distribution/bin 目录下的 mqnamesrv 和 mqbroker 是启动的关键。例如  mqnamesrv #!/bin/sh # Licensed to the Apa...

2018-07-02 15:44:26 411 0

原创 Spring 源码阅读 -- 事务

Spring 事务就是把 JDBC 模板化的代码封装好,本质上还是1. 开启事务2. 业务逻辑(JDBC 操作)3. commit/rollback4. 资源释放(数据库连接)Spring 帮助我们做了上述1,3,4三步(第 2 步是我们的业务代码)下面是我读事务这块的源码整理的思维导图:源码写了...

2018-05-20 17:20:48 134 0

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

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

2017-10-28 17:09:38 7322 0

原创 ZooKeeper Watch 回调事件丢失

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

2017-09-27 20:31:02 2808 2

原创 ZooKeeper 概述

ZooKeeper: 一个分布式应用的分布式协调服务 ZooKeeper (下面简称 ZK)是一个分布式应用的分布式的、开源的协调服务。ZK 提供一系列原语使得分布式应用可以诸如同步、配置维护、分组和命名等高层次服务。它运行在 Java 环境。 协调服务不好写正确。经常发生的错误有竞态...

2017-08-19 14:15:08 528 0

原创 Redis Cluster 简介与部署

一. Redis Cluster 简介 需要 3.0 及以后版本才能支持 cluster Redis Cluster 带来的优势 使用 redis cluster 安装后,数据会自动分片到多个 redis 节点(如果使用 sentinel 则需要自己实现分片算法)个别节点...

2017-06-27 15:51:15 1031 0

原创 JDK 源码解析 —— ThreadLocal

零. 简介 这个类提供本地线程变量。不同于一般的变量,这些变量在他们各自的线程里通过 get、set 访问一个它自己的变量,这是一个独立初始化的变量副本。在一个类中,ThreadLocal 实例一般是 private static 的,期望和一个线程关联状态(如 userId,transacti...

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

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

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

2017-02-14 16:22:02 2113 0

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

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

2017-01-18 15:28:54 479 0

原创 Spring 源码解析 ---- 事件监听

一. 测试用例 package main.java.com.wenniuwuren.spring.event.listener; import org.springframework.context.ApplicationEvent; /** * 定义监听事件 * Created by...

2016-11-23 10:08:48 1245 0

原创 Spring 自定义标签

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

2016-11-15 15:23:12 1109 0

翻译 MongoDB 简介

一. 概述 MongoDB 是一个开源的文档数据库,提供了高性能、高可用和自动分片特性。 二. 文档数据库 在 MongoDB 中一条记录就是一个文档,就是一个键值对数据结构。MongoDB 文档和 JSON 对象相似。值可以包含其他文档、数组和数组文档。 使用...

2016-10-27 15:06:12 866 0

翻译 MongoDB 分片键

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

2016-10-27 14:02:29 7654 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 ...

2016-10-24 13:43:34 906 0

原创 LeetCode ---- Add Digits (Java/Lua 实现)

题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38...

2016-10-21 17:00:53 643 0

原创 LeetCode ---- Fizz Buzz (Java/Lua 实现)

题目: Write a program that outputs the string representation of numbers from 1 to n. But for multiples of three it should output “Fizz” inste...

2016-10-20 20:34:11 2506 0

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