自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 收藏
  • 关注

原创 3分钟白话RocketMQ系列—— 核心概念

白话3分钟,快速了解RocketMQ基础,包括适用场景,以及基本概念。看完如果不了解,欢迎来打我。

2023-08-02 09:32:52 538

原创 线上kafka消息堆积,consumer掉线,怎么办?

最近处理了一次线上故障,具体故障表现就是kafka某个topic消息堆积,这个topic的相关consumer全部掉线。整体排查过程和事后的复盘都很有意思,并且结合本次故障,对kafka使用的最佳实践有了更深刻的理解。好了,一起来回顾下这次线上故障吧,最佳实践总结放在最后,千万不要错过。

2022-11-14 13:48:51 855 1

原创 SpringCloud与云原生

很多公司在设计自己的RPC框架时,都会基于Spring Cloud做二次开发。并且会大量使用Spring Cloud Netflix相关的模块与代码。因此,我们去梳理一下Spring Cloud的前世今生,以及未来云原生发展的趋势,可以给这些RPC框架的演进带来一些启发。

2022-11-14 13:39:54 1337

原创 浅析任务队列、消息队列、任务调度系统

本文通过多个维度来进行拆解,试着分析 任务队列、消息队列、任务调度系统 这三类中间件 究竟有哪些不同,究竟谁更适合什么场景。

2022-11-14 13:33:31 1057

原创 除了「加机器」,其实你的微服务还能这样优化

本文从「AKF扩展立方」说起,介绍了提高服务负载能力的几种服务治理方式。除了X轴扩展(加机器)外,还可以通过Y轴扩展(功能/业务拆分)、Z轴扩展(数据分区)等方式,更优雅、更精细地进行优化。

2022-10-31 11:05:47 94

原创 架构师进阶,微服务设计与治理的16条常用原则

架构师在进行微服务设计和微服务治理时,可以围绕微服务生命周期的七个阶段展开。本文总结了16条常用原则,希望能提供一些思路和启发。

2022-07-15 13:40:04 430

原创 架构师之路,从「存储选型」起步

在业务开发过程中,除了常用的MySQL,一定要多关注市面上更合适的存储方案,这是架构师的基本功。通过了解更多存储组件的基本特性和使用场景,因地制宜选择合适存储,提高业务开发效率,降低使用成本。希望本文能够抛砖引玉,提供一些启发和思考。...

2022-06-22 13:37:43 641

原创 爷青回,canal 1.1.6来了,几个重要特性和bug修复

刚刚在群里看到消息说,时隔一年,canal 1.1.6正式release了,赶紧上去看看有什么新特性。

2022-05-27 10:03:02 1356 7

原创 Java SPI 和 API,傻傻分不清?

最近新写了一个中间件「运行时动态日志等级开关」,其中使用Java SPI机制实现了自定义配置中心,保证良好的扩展性。项目地址,走过路过可以点个star :)https://github.com/saigu/LogLevelSwitch在使用过程中,突然发现SPI其实和日常写API接口,然后进行implements实现非常相似,那SPI到底和普通API实现有啥区别呢?带着这个问题,我们一起来梳理下SPI机制吧。本文预计阅读时间10分钟,将围绕以下几点展开:什么是 SPI 机制

2022-05-27 10:00:17 265

原创 写了个开源小中间件——运行时动态日志等级开关

a middleware project for log level change during application runtime

2022-04-18 10:20:06 280

原创 硬吃一个P0故障,「在线业务」应该如何调优HBase参数?

本文从HBase「基础架构」出发,梳理各个组件、读写流程的参数调优,期望能满足「在线业务」的 高可用、低抖动 的需求。

2022-03-21 13:49:01 2665

原创 记一次异步处理导致Jetty Request对象泄漏

最近排查一个bug,发现了一系列有意思的东西,对「自定义线程池」、「Jetty线程模型」都有了一些新的认识。

2022-01-11 00:46:31 328

原创 到底谁才需要Service Mesh?

本文是Service Mesh系列第1篇随着云原生时代的来临,使用微服务架构的朋友们开始听到一个新的技术名词——Service Mesh(现在来说已经不算新了)。对于一项新技术的学习,总归绕不过两个问题:它是什么? 为什么需要它?本文将围绕这两个问题进行展开,期望对Service Mesh有一个综述性的了解。最后,引发一个核心的思考:到底谁才需要Service Mesh?1. 什么是Service MeshService Mesh在国内被翻译「服务网格」。目前比较公认..

2021-11-09 10:16:31 148

原创 Netty常用招式——ChannelHandler与编解码

本文是Netty系列第8篇上一篇文章我们深入学习了Netty逻辑架构中的核心组件ChannelHandler和ChannelPipeline,并介绍了它在日常开发使用中的最佳实践。文中也提到了,ChannelHandler主要用于数据输入、输出过程中的加工处理,比如编解码、异常处理等。今天,我们就选取日常开发中最常用的一种ChannelHandler用途来学习——编解码器。如果说ChannelHandler的学习是Netty的基础招式,那么编解码就是“基础招式”中衍生出的“常用招式“,我们往.

2021-10-08 21:56:46 434

原创 Netty基础招式——ChannelHandler的最佳实践

本文是Netty系列第7篇上一篇文章我们深入学习了Netty逻辑架构中的核心组件EventLoop和EventLoopGroup,掌握了Netty的线程模型,并且介绍了Netty4线程模型中的无锁串行化设计。今天,我们继续学习Netty逻辑架构中的另一个核心组件ChannelHandler和ChannelPipeline。如果说线程模型是Netty的“核心内功”,那么ChannelHandler就是Netty最著名的“武功招式”,是我们日常使用Netty时接触最多的组件。引用...

2021-08-09 14:11:18 489

原创 深入Netty逻辑架构,从Reactor线程模型开始

本文是Netty系列第6篇上一篇文章我们从一个Netty的使用Demo,了解了用Netty构建一个Server服务端应用的基本方式。并且从这个Demo出发,简述了Netty的逻辑架构,并对Channel、ChannelHandler、ChannelPipeline、EventLoop、EventLoopGroup等概念有了初步的认识。回顾一下逻辑架构图。今天主要是深入学习下逻辑架构中的EventLoop 和 EventLoopGroup,掌握Netty的线程模型,这是Netty最精髓的知识点之.

2021-06-17 13:19:06 221 3

原创 从一个Demo开始,揭开Netty的神秘面纱

本文是Netty系列第5篇上一篇文章我们对于I/O多路复用、Java NIO包 和 Netty 的关系有了全面的认识。到目前为止,我们已经从I/O模型出发,逐步接触到了Netty框架。这个过程中,基本解答了Netty是什么、为什么使用Netty等前置问题。给我们学习Netty提供了最原始的背景知识。有了这些做基础,下面我们可以开始慢慢去揭开Netty的神秘面纱了。本文预计阅读时间约 5分钟,将重点围绕以下几个问题展开:如何用Netty编写一个Server端服务Demo从Demo看Netty.

2021-04-19 14:11:29 177 1

原创 从I/O多路复用到Netty,还要跨过Java NIO包

本文是Netty系列第4篇上一篇文章我们深入了解了I/O多路复用的三种实现形式,select/poll/epoll。那Netty是使用哪种实现的I/O多路复用呢?这个问题,得从Java NIO包说起。Netty实际上也是一个封装好的框架,它的网络I/O本质上还是使用了Java的NIO包(New IO,不是网络I/O模型的NIO,Nonblocking IO)包。所以,从网络I/O模型到Netty,我们还需要了解下Java NIO包。本文预计阅读时间 5 分钟,将重点回答以下几个问题:如何用J.

2021-03-23 12:47:27 276 1

原创 从网络I/O模型到Netty,先深入了解下I/O多路复用

Context1.I/O多路复用模式的实现2. select3. poll4. epoll4.1 epoll的三个核心函数4.2 epoll的实现原理4.3 epoll中有使用共享内存吗?5.三种实现对比本文是Netty系列第3篇上一篇文章我们了解了Unix标准的5种网络I/O模型,知道了它们的核心区别与各自的优缺点。尤其是I/O多路复用模型,在高并发场景下,有着非常好的优势。而Netty也采用了I/O多路复用模型。那Netty是如何实现I/O多路复用的呢?Netty实际上也是一个封装好的框架,

2021-02-09 09:51:56 311 1

原创 没搞清楚网络I/O模型?那怎么入门Netty

本文是Netty系列笔记第二篇Netty是网络应用框架,所以从最本质的角度来看,是对网络I/O模型的封装使用。因此,要深刻理解Netty的高性能,也必须从网络I/O模型说起。看完本文,可以回答这三个问题:五种I/O模型是什么?核心区别在哪里?同步=阻塞?异步=非阻塞?Netty的高性能,是采用了哪种I/O模型?1.掌握五种I/O模型的关键钥匙Unix系统下的五种基本I/O模型大家应该都有所耳闻,分为:blocking I/O(同步阻塞IO,BIO)nonblocking I/O.

2021-01-18 10:25:20 221

原创 打算写一些Netty的文章了,先聊聊为什么要学习Netty

2021年了,终于开始系统性总结Netty相关的东西了。这会是Netty系列的第一篇,我想先聊聊 “为什么要学习Netty”。绕不开的编程框架Java进阶之梯面试“绝招”一个小小的心结1.绕不开的框架说到Netty,相信所有做Java后端开发的同学都应该听说过。这是一个再经典不过、且仍然被广泛使用的网络编程框架。就我接触过并看过源码的开源项目,可以说基本上都是使用Netty作为网络通信的底层框架,包括Dubbo、RocketMQ、Canal、otter、HBase等等。所以,我始终认

2021-01-11 19:14:44 655 1

原创 2020实战复盘:如何从0到1搭建数据传输平台产品DTS?

2020年下半年的主要任务,就是从0到1搭建了数据传输服务平台产品。平稳上线后,基本达到预期,实现了最初的产品规划目标。这里做个复盘,记录下从0到1的过程,包括:产品设计整体技术架构核心模块的技术选型、原理与改造适配总结与展望1.什么是数据传输服务数据传输服务DTS(Data Transmission System)的目标是支持RDBMS、NoSQL、OLAP等数据源间的数据交互,集数据迁移/订阅/同步于一体,帮助构建安全、可扩展、高可用的数据架构。当然,目前我们的核心存储还是以MySQ

2021-01-04 10:40:23 616

原创 拥抱云原生,如何将开源项目用k8s部署?

k8s以及云原生相关概念近年来一直比较火热,阿丸最近搞了个相关项目,小结一下。本文将重点分享阿里开源项目otter适配k8s部署的改造过程,其中的改造过程和技巧应该适用于将大多数开源项目改造到k8s进行部署。1.背景otter是阿里开源的分布式数据库同步系统,基于数据库增量日志解析,并准实时同步到本机房或异地机房的mysql/oracle数据库(相关内容可以参考https://github.com/alibaba/otter,本文不做过多赘述)。为了充分利用物理资源、快速扩容同步节点、拥抱云原生,

2020-12-21 12:55:08 757

原创 使用过mysql的binlog吗?看看如何用binlog排查阿里开源项目otter的问题

MySQL的binlog相信大家都有所耳闻,但是可能没有真正日常使用过。因此,本文结合一个otter小坑的排查案例,来分享下binlog的日常使用方式。重点了解下:binlog的导出方式binlog的解析方式结合案例分享下开源项目otter的一个小坑1.案例背景某个周末突然收到报警,发现线上多云数据库的数据同步任务挂起,显示日志写入数据失败。错误原因非常明显:唯一索引冲突。查看了一下源库的数据内容,确实已经update完毕。而目标库的数据内容,确实存在冲突导致无法update。2

2020-12-04 19:19:49 335

原创 亿级大表分库分表实战总结(万字干货,实战复盘)

分库分表的文章网上非常多,但是大多内容比较零散,以讲解知识点为主,没有完整地说明一个大表的切分、新架构设计、上线的完整过程。因此,我结合去年做的一个大型分库分表项目,来复盘一下完整的分库分表从架构设计 到 发布上线的实战总结。1.前言为什么需要做分库分表。这个相信大家多少都有所了解。海量数据的存储和访问成为了MySQL数据库的瓶颈问题,日益增长的业务数据,无疑对MySQL数据库造成了相当大的负载,同时对于系统的稳定性和扩展性提出很高的要求。而且单台服务器的资源(CPU、磁盘、内存等)总是有限的,

2020-11-16 16:52:22 1087 1

原创 线上问题排查,一不小心踩到阿里的 arthas坑了

最近帮新来的校招同学排查一个线上问题,问题本身不是很难,但是过程中踩到了一个arthas的坑,挺有意思的。同时,也分享下在排查过程中使用的一些比较实用的工具,包括tcpdump、arthas、simpleHTTPServer等,希望能对大家有所帮助。1.问题描述新开发的一个功能,简单来说,就是读取数据库的数据展示在前台。本地启动服务调试,用postman调用api,返回数据显示正常,数据中的中文也正常。但是部署到线上环境后,通过chrome浏览器调用和postman调用接口,返回的非中文数据正常,

2020-10-27 13:55:34 3379 15

原创 用ThreadLocal来优化下代码吧

最近接手了一个老项目,看到一个很有意思的现象。这个项目中大量的方法入参都会带上user信息,比如这样它的意图是希望在方法内使用user的信息,但是如此大范围的传递用户信息,第一感觉就是不优雅。那有什么办法可以优化一下呢?我们第一反应是,可以存一个全局变量,在初始位置将用户信息存入全局变量,然后在需要的地方去get一下。那在WEB应用中,每个请求都是一个独立线程,怎么去标记呢?可以用线程的id去作为map的key,将该请求的用户信息作为map的value。咦?很熟悉的感觉。没错,Java已

2020-09-30 14:20:43 874 1

原创 基于canal的client-adapter数据同步必读指南

本文将介绍canal项目中client-adapter的使用,以及落地生产中需要考虑的可靠性、高可用与监控报警。(基于canal 1.1.4版本)canal作为mysql的实时数据订阅组件,实现了对mysql binlog数据的抓取。虽然阿里也开源了一个纯粹从mysql同步数据到mysql的项目otter(github.com/alibaba/otter,基于canal的),实现了mysql的单向同步、双向同步等能力。但是我们经常有从mysql同步数据到es、hbase等存储的需求,就需要用户自己用ca

2020-09-04 10:47:06 9084 7

原创 「从零单排canal 07」 parser模块源码解析

基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal本文将对canal的binlog订阅模块parser进行分析。parser模块(绿色部分)在整个系统中的角色如下图所示,用来订阅binlog事件,然后通过sink投递到store.parser模块应该来说是整个项目里面比较复杂的模块,代码非常多。因此,本文根据过程中的主线来进行展.

2020-08-21 16:48:50 869 1

原创 「从零单排canal 06」 instance模块源码解析

基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canalinstance模块比较简单,我们重点了解以下几个问题instance配置模式有哪几种,如何根据配置创建instance?远端配置如何覆盖本地配置的?instance实例内部有哪些组件?1.基本结构instance模块下面也分为三个子模块,core、manager、spr.

2020-07-28 13:05:40 452

原创 「从零单排canal 05」 server模块源码解析(1.1.5-sp版本)

基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal本文将对canal的server模块进行分析,跟之前一样,我们带着几个问题来看源码:CanalServer有几种使用方式?控制台Admin、客户端client是如何与CanalServer交互的?CanalServerWithNetty和CanalServerWithEmbedd.

2020-07-19 19:21:54 608

原创 「从零单排canal 04」 启动模块deployer源码解析

基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal本文将对canal的启动模块deployer进行分析。Deployer模块(绿色部分)在整个系统中的角色如下图所示,用来启动canal-server.模块内的类如下:为了能带着目的看源码,以几个问题开头,带着问题来一起探索deployer模块的源码。CanalServer启.

2020-07-05 21:37:46 743 1

原创 「从零单排canal 03」 canal源码分析大纲(1.1.4版本)

在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识。从这一篇开始,我们将从源码入手,深入学习canal的实现方式。了解canal相关功能的实现方式,其中有很多机制是非常值得深入了解的,从代码实现角度去学习实时数据订阅与同步的实现与核心技术点。当然,如果要在生产中使用这个开源项目,了解源码更是必不可少,是解决问题和新特性定制的前提条件。本文使用的版本是1.1.4,这也是笔者写这篇博客时的最新稳定版。1.准备工作下载源码git

2020-06-22 09:58:05 685

原创 「从零单排canal 02」canal集群版 + admin控制台 最新搭建姿势(基于1.1.4版本)

canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费。应该是阿里云DTS(Data Transfer Service)的开源版本,开源地址:https://github.com/alibaba/canal。canal从1.1.4版本开始引入了admin控制台,有了很多不一样的配置方式。在搭建过程中如果仅仅按照wiki的用户手册,还是容易踩很多坑的。因此,将笔者在搭建过程中的步骤记录下来,作为官方wiki的 补充,希望能有所帮助

2020-06-10 12:56:04 3485 6

原创 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

1.简介canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费。应该是阿里云DTS(Data Transfer Service)的开源版本。2.提供的能力Canal与DTS提供的功能基本相似:1)基于Mysql的Slave协议实时dump binlog流,解析为事件发送给订阅方。事件格式为(伪代码):Eevnt { Header { logfileName [binlog文件名]

2020-06-04 21:15:02 794

原创 实时数据订阅与分发系统概述

实时数据订阅与分发系统可以将业务数据源变更实时分发分发到消息总线上,并维护消息的统一格式,提供通用的客户端框架供消息生产者与下游业务接入。一般能用于以下场景:索引构建:MySQL到ES缓存管理:MySQL到Redis或本地cache数据库镜像实时备份价格变化等重要业务信息订阅实时数据订阅与分发系统一般都有如下几个核心模块构成:Change Data Capture(变更数据抓取,CDC):负责实时抓取业务数据源的变更消息;消息中间件:支撑消息的分发与堆积;

2020-05-27 22:47:46 3578

原创 使用phoenix踩的坑与设计思考

本文主要介绍在压测HBase的二级索引phoenix时踩的一个坑,使用时需要特别注意,而且背后的原因也很有意思,可以看出HBase和Phoenix对元数据设计上的差异。1.问题介绍在做phoenix压测时发现一个奇怪的现象。压测请求分布非常均匀,但是有一台机器的流量、负载都明显高于其他机器。如下图所示。请求均匀资源利用率不均匀,单个节点明显偏高。2.排查思路看到这个问题的第一反应,是去看下表分布是否均匀。hbase表分布是否均匀索引表分布是否均匀令人遗憾的是,确认后hbase表

2020-05-21 09:09:14 680

原创 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践

Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引。当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告诉你。1.什么是PhoenixPhoenix完全使用Java编写,将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。Phoenix主要能做以下这些事情:将SQL查询编译为HBase扫描scan确定scan的开始和停止位置将scan并行执行将where子句中的谓词推

2020-05-18 13:02:05 513

原创 「从零单排HBase 11」HBase二级索引解决方案

HBase一个令人惋惜的地方,就是不支持二级索引。因此,社区有了很多补充方案来填补HBase的二级索引能力的缺陷。今天,我们就来看看有哪些二级索引方案,通过对比各个方案的优缺点,并结合我们的具体场景做出二级索引方案选型。1.为什么需要二级索引HBase系统单纯从解决大数据实时读写问题角度出发,重点关注于分布式存储的扩展性、容错性、读写性能等方面,为此也牺牲了很多传统关系型数据库的功能,比如事务,SQL表达与分析等。实际上,这是NoSQL最初的含义,以解决大数据的实时存取为首要目标,提供简单的Get,

2020-05-15 09:04:01 253

原创 「从零单排HBase 10」HBase集群多租户实践

在HBase1.1.0发布之前,HBase同一集群上的用户、表都是平等的,大家平等共用集群资源。容易碰到两个问题:一是某些业务较其他业务重要,需要在资源有限的情况下优先保证核心重要业务的正常运行二是有些业务QPS常常很高,占用大量系统资源,导致其他业务无法正常运转。这是典型的多租户问题。因此,我们需要通过资源隔离来解决多租户问题,同时,需要考虑计算型业务与存储型业务混合部署来提高集群的资源利用率。1.基本概念1.1 namespace逻辑隔离HBase命名空间 namespace 与关系数据

2020-05-13 09:33:52 335

空空如也

空空如也

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

TA关注的人

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