自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 后端程序员生产力工具合集

后端程序员除了写代码,也难免要写设计文档,画各种图。因此掌握各种生产力工具,是很有必要的,可以达到事半功倍的效果。下面结合楼主亲身体验,推荐一些生产力工具,欢迎探讨和补充。...

2022-08-29 09:29:09 1297 1

原创 Java反射原理和实际用法

看一下官方的原文定义:翻译过来就是:反射是指一个运行中的Java程序可以检查、修改自己内部的属性,也可称之为自省。反射是Java有别于其它编程语言的一大特性。从reflection的字面意思看,就是倒影、反射,就好比你照镜子,通过倒影就能知道自己长什么样,理一理头发就能改变发型。...

2022-08-14 20:47:37 771

原创 树莓派实战:微信机器人(itchat实现)

itchat是一个开源的微信个人号接口,使用不到三十行的代码,就可以完成一个能够处理所有信息的微信机器人。github地址https你一定对原理感到好奇。其实可以概括为一句话itchat本质上是一个微信网页版客户端,它实现了微信网页版的协议/语义,通过http来通信。具体源码可以看components包里的文件。下面分点介绍如何实现有趣的功能。...

2022-07-15 22:59:46 784 1

原创 架构师必备:系统容量现状checklist

正如飞机在起飞前,机长、副机长要过一遍checklist检查,确认没问题了才能起飞。楼主也整理了一个系统容量现状checklist,方便对照检查。本文搭配架构师必备:如何做容量预估和调优,食用更佳。作为架构师,不要觉得系统容量是运维工程师才关心的问题,而应当对系统容量现状做到了如指掌。这样才能知道系统的瓶颈在哪,哪些优化是要优先做的,以及为了应对活动期间突发的流量,做多少扩容。本文分为2大部分,一是资源使用率,二是业务指标。资源使用率服务实例实例个数、每个实例server的工作线程个数、MQ消费

2022-06-13 09:24:41 367

原创 架构师必备:HBase行键设计与应用

首先要回答一个问题,为何要使用HBase?随着业务不断发展、数据量不断增大,MySQL数据库存在这些问题:要使用HBase,最重要的一点是rowkey行键设计,如果设计不妥,后续要改的代价非常大。下面列几个HBase rowkey设计的原则:...

2022-06-07 08:45:33 312

原创 架构师必备:多维度查询的最佳实践

背景有2种常见的多维度查询场景,分别是:带多个筛选条件的列表查询不含分库分表列的其他维度查询普通的数据库查询,很难实现上述需求场景,更不用提模糊查询、全文检索了。下面结合楼主的经验和知识,介绍初级方案、进阶方案(上ElasticSearch),大部分情况下推荐使用ElasticSearch来实现多维度查询,赶时间的读者可以直接跳到“进阶方案:将ElasticSearch添加到现有系统中”。初级方案1、根据常见查询场景,增加相应字段的组合索引这个是为了实现带多个筛选条件的列表查询的。优点

2022-05-22 11:11:28 361

原创 架构师必备:Redis的几种集群方案

结论有以下几种Redis集群方案,先说结论:Redis cluster:应当优先考虑使用Redis cluster。codis:旧项目如果仍在使用codis,可继续使用,但也推荐迁移到Redis cluster。twemproxy:不建议使用,与codis同为proxy方案,但不如codis(twemproxy不能平滑地扩容)。客户端分片:应当禁止使用,因为扩容复杂,如果2个服务同时读写,其中一个修改了路由,另一个不修改会有问题。下面重点介绍Redis cluster和codis。Redi

2022-04-30 23:48:28 461

原创 Spring cache源码分析

Spring cache是一个缓存API层,封装了对多种缓存的通用操作,可以借助注解方便地为程序添加缓存功能。常见的注解有@Cacheable、@CachePut、@CacheEvict,有没有想过背后的原理是什么?楼主带着疑问,阅读完Spring cache的源码后,做一个简要总结。先说结论,核心逻辑在CacheAspectSupport类,封装了所有的缓存操作的主体逻辑,下面详细介绍。题外话:如何阅读开源代码?有2种方法,可以结合起来使用:静态代码阅读:查找关键类、方法的usage之处,熟练

2022-03-30 10:20:01 951

原创 架构师必备:本地缓存原理和应用

先说结论:本地缓存优先选用caffeine,因为性能比guava cache快,api风格与之兼容、能轻松地平滑迁移,并且在spring/spring boot最新版本中已经是默认本地缓存了。下面展开讲讲本地缓存和Spring cache。本文讨论堆内缓存,暂不讨论堆外缓存。堆内缓存是指缓存与应用程序在一个JVM应用中,会受GC影响,一般业务层面的应用开发用不到堆外缓存。1、什么场景使用本地缓存并非所有的缓存场景,redis都适用,以下情况应当优先考虑本地缓存。数据量不大修改频率低、甚至是静态的

2022-02-28 23:59:43 778

原创 架构师必备:系统性解决幂等问题

要在应用中做到幂等,其实并不难,本文尝试做一个系统性的总结,欢迎一起探讨。什么是幂等某个操作执行一次,跟执行多次的效果一样。幂等一词来自于数学中的幂等,即f(f(x)) = f(x)。需要保证幂等的场景查询类的读操作,天然是幂等的,多次调用不会有副作用。需考虑以下几种写操作的情况:调用下游写接口写数据库、写Redis等消息订阅和处理例子:不能给用户重复发放优惠券、现金奖励、通知等,商家更新商品时不能重复增加或减少库存。下面分别讨论这几种情况。1、调用下游写接口主要依靠下游服务保证幂

2022-01-14 00:07:12 1474

原创 架构师必备:如何做容量预估和调优

为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标一开始就要明确定义QPS保障目标,以此来推算所需的服务、存储资源。可根据历史同期QPS,或者平时峰值的2到3倍估算。压测目标示例:qps达到多少时,服务的负载正常,如平均响应时间、95分位响应时间、cpu使用率、内存使用率、消费延迟低于多少不要让任何一个环节成为瓶颈,需考虑服务实例、数据库、Redis、ES、Hbase等资源

2021-12-24 00:43:38 1834

原创 架构师必备:巧用Canal实现异步、解耦的架构

本文介绍如何应用Canal实现异步、解耦的架构,后续有空再写文章分析Canal原理和源代码。Canal简介Canal是用来获取数据库变更的中间件。伪装自己为MySQL从库,拉取主库binlog并解析、处理。处理结果可发送给MQ,方便其他服务获取数据库变更消息,这一点非常有用。下面介绍一些典型用途。其中,Canal+MQ作为一个整体,从外界看来就是一个数据管道服务服务,如下图。Canal典型用途异构数据(如ES、HBase、不同路由key的DB)通过Canal自带的adapter,同步异构数

2021-11-27 00:36:31 2082

原创 架构师必备:MySQL主从延迟解决办法

上一篇文章介绍了MySQL主从同步的原理和应用,本文总结了MySQL主从延迟的原因和解决办法。如果主从延迟过大,会影响到业务,应当采用合适的解决方案。MySQL主从延迟的表现先insert或update写入更新操作,再立即select查询,但是得不到最新的结果。可通过show slave status命令,结果中的Seconds_Behind_Master列,查看主从延迟的秒数。MySQL主从延迟的原因读写分离时,写操作走主库,读操作走从库,但是主库的变更还未同步至从库网络传输延迟:从库发起d

2021-10-16 20:53:24 407

原创 架构师必备:MySQL主从同步原理和应用

日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从、或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能。楼主将在本文做总结,看这一篇就够了。1、主从同步原理主从同步架构图(异步同步)这是最常见的主从同步架构。主从同步流程(异步同步)主库把数据变更写入binlog文件从库I/O线程发起dump请求主库I/O线程推送binlog至从库从库I/O线程写入本地的relay log文件(与binlog格

2021-10-09 00:16:04 177

原创 应用开发中的存储架构进化史——从起步到起飞

按楼主的经验和知识,本文总结了应用开发中的各种存储架构,从易到难,从起步到起飞。如有不对之处,欢迎留言。1、单库:最简单的初始架构,适用于千万级以下的数据,并发量低的场景。单库、单表或单库、多个分表:之所以分表是为了给后续分库做预留准备2、分库分表、读写分离:最常见的存储架构,适用于十亿级别以下的数据,并发量大、主备高可用的场景。分库分表:对业务id(如用户id、商户id)取模,散列到各个分库的分表中读写分离:适用于读多写少的场景,利用数据库一主多从的方式,提高并发量,对主库读写,对从库只读

2021-09-27 09:16:24 128

原创 Java子线程中的异常处理

在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了。那么,在并发情况下,比如在父线程中启动了子线程,如何在父线程中捕获来自子线程的异常,从而进行相应的处理呢?也许有人会觉得,很简单嘛,直接在父线程启动子线程的地方try ... catch一把就可以了,其实这是不对的。楼主想到了3种常用方法,分享给大家。

2017-09-24 22:13:01 343

空空如也

空空如也

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

TA关注的人

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