本文为分布式系列文章的集锦汇总,长期保持置顶及更新,读者可以在本文中更好的学习到某个具体的系列。

注: 转载本博客文章请注明出处,原创不易,洗文可耻。

我说分布式事务系列

文章链接
我说分布式事务之TCC
我说分布式事务之最大努力通知型事务
我说分布式事务之可靠消息最终一致性事务1-原理及实现
我说分布式事务之消息一致性事务2-rocketmq的实现
【汇总】我说分布式事务系列
分布式事务之聊聊TCC
分布式事务最终一致性常用方案
TCC-Transaction源码解析之事务执行
TCC-Transaction源码解析之事务补偿
自己写分布式事务框架之原理篇[详解本地消息表]

跟我学RocketMQ

文章链接
[1-1]安装RocketMQ
[1-2]安装RocketMQ-Console管理平台
[1-3]发送普通消息及封装DefaultMQProducer支持spring
[1-4]消费消息及封装DefaultMQPushConsumer支持spring
[1-5]发送事务消息实现分布式事务及封装TransactionMQProducer支持spring
[2-0]跟我学RocketMQ之消息重试
[2-1]跟我学RocketMQ之消息幂等
[2-2]跟我学RocketMQ之消息轨迹实战与源码分析
[2-3]跟我学RocketMQ之消息发送源码解析
[2-4]跟我学RocketMQ之批量消息发送源码解析
[2-5]跟我学RocketMQ之消息消费源码解析-p1
[2-6]跟我学RocketMQ之消息消费源码解析-p2
[2-7]跟我学RocketMQ之订阅关系一致性源码讨论
[2-8]跟我学RocketMQ之消息拉取源码解析
[2-9]跟我学RocketMQ之开源客户端混合云实践与案例解析
[2-10]跟我学RocketMQ之事务消息发送源码解析
[2-10]跟我学RocketMQ之事务消息存储源码解析
[2-11]跟我学RocektMQ之事务消息提交及回查源码解析
[2-12]跟我学RocketMQ之定时消息源码解析
[2-13]跟我学RocektMQ之理解长轮询机制
[2-14]跟我学RocketMQ之消息持久化原理与Mmap
[2-15]跟我学RocketMQ之拉模式消费的两种方式
[2-16]跟我学RocketMQ之聊聊死信队列

分库分表

文章链接
我说分布式之分库分表
跟我学shardingjdbc之shardingjdbc入门
跟我学shardingjdbc之使用jasypt加密数据库连接密码
跟我学shardingjdbc之分布式主键及其自定义
跟我学shardingjdbc之自定义分库分表策略-复合分片算法自定义实现

Read More

本文将主要记录在日常开发中遇到的各种问题。以技术类别进行章节划分,作为个人的编码备忘录随时进行查阅,并长期进行置顶。

问题排查

CPU异常飙高排查思路

cpu占用高如何排查

  • 查看占用cpu高的进程: 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID {pid}。

    top -M -n 2 -d 3 >{pid}/top.txt 查看top

  • 再次通过 top -Hp {pid} 找到 CPU 消耗最高的线程 ID,并记住线程 ID(十进制).
  • 通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。

    jstack {pid} >{pid}/jstack_1.txt 一次堆栈快照 备用

    jstack {pid} >{pid}/jstack_2.txt 两次堆栈快照 备用

  • 由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。

    使用 printf “%x\n” [十进制数字] ,可以将10进制转换成16进制。

  • 通过刚刚转换的16进制数字从堆栈信息里找到对应的线程堆栈。就可以从该堆栈中看出端倪。

  • 通过top查看当前进程cpu占用情况,找到cpu使用最高的进程PID
  • 查看子进程情况

    top -p 4606 -H

  • 将 子进程id 转换成16进制

    printf “%x \n” 4648 结果为1228

  • 使用jstack查询具体出现问题的代码位置

    jstack 4606|grep 1228 -C 30

  • 根据打印结果定位到具体代码位置

JavaCore相关

该模块主要记录JavaCore相关的技术点

bigdecimal四舍五入

BigDecimal.ROUND_HALF_UP: 遇到.5的情况时往上近似,例: 1.5 ->;2
BigDecimal.ROUND_HALF_DOWN : 遇到.5的情况时往下近似,例: 1.5 ->;1

bigDecimal转换为百分比,保留若干小数

DecimalFormat decimalFormat = new DecimalFormat("0.00%");
BigDecimal decimal = new BigDecimal(count.intValue()).divide(new BigDecimal(allCount), 5, ROUND_HALF_UP);
String formatted = decimalFormat.format(sdPercent);

bigDecimal精确度

BigDecimal.setScale(5,  BigDecimal.ROUND_HALF_UP)  -->保留五位小数,最后一位遇到.5的情况时往上近似

Read More


title: 推与拉,RocketMQ消息消费的那些姿势
date: 2022-05-11 21:44:12
categories: 跟我学RocketMQ
tags: 跟我学RocketMQ

keywords: 跟我学RocketMQ

消息消费方式,一般来说有两种姿势,我们往往称之“推”模式(Push)以及“拉”模式(Pull),如图所示。

pullpush.png

Read More

有没有想过,有这么一门课程。他不是简单的念PPT,他的老师是计算机史上五大黑客之一的罗伯特·塔潘-莫里斯(RobertTappanMorris);

有没有想过,有这么一门课程,他会带你阅读GFS、Map Reduce、RAFT、Big Table论文;

来看看他的四个实验作业题:

  • 基于论文思路,实现一个简单的 MapReduce 框架。这个作业的实现前提是你得了解 Unix Domain socket,知道goalng plugin(也就是动态链接)。
  • 实现一个完整的Raft协议。这部分拆成了三个部分,它会分别让你实现 Leader Election、AppendEntry RPC 和 Raft persist。
    • 在这一部分里,我们将使用提供的类库 labrpc 来完成完整的Raft。其中, labrpc 是一个模拟网络环境的 rpc 框架,它是基于 UDP实现的(注意这一点)。
  • 根据自己实现的Raft,写一个KV数据库。同时实现 Raft 协议的 Snapshot RPC。
  • 在之前的作业基础上,为KV数据库实现Sharding分片功能,同时实现 multi Raft功能。

笔者在看到这部分的时候,惊为天人。这课程,硬核!

这门课就是MIT6.824,由罗伯特·塔潘-莫里斯教授教学。

MIT 6.824 是一门讲解分布式系统的课程。

课程内容包括Golang的学习、分布式系统研究动机、一致性协议算法、著名分布式系统软件论文讲解和一致性算法 (Raft算法)的实现机制及实验。

是一门不可多得的实践性质比较强的课程。

虽说这门课程受众主要是MIT研究生,但是笔者认为该课程对有一定工作经验的工程师有着更多的指导意义和参考价值。

他可以帮助工程师对自己的知识体系有一个系统性的整理,如果你恰巧是一个动手能力、自学能力强的人,那么这门课程一定适合你。

学习资料

课程是纯英文的,因此对于大多数人而言可能是比较陡峭的门槛,幸运的是,已经有无私的翻译者提供了人工翻译的版本。

人工翻译版本

B站地址:MIT 6.824 Distributed Systems Spring 2020 分布式系统 中文翻译版合集

除此之外,官方课件的地址在着这里,包括了上文提到的四个实验:

6.824 Schedule:Spring 2022

Raft作业难度高?不要怕,这里已经网友贡献的学生作业指南:

Raft学生指南:一

Raft学生指南:二

Raft学生指南:三

Raft算法不好理解,不够直观?我想这两个可视化呈现Raft算法的网站是你想要的:

https://raft.github.io/ 在该页面的Raft Visualization部分,提供了一个可交互的Raft集群,你可以与该Raft集群进行交互以理解算法。

动画呈现Raft算法的主要细节与设计思想

Raft论文中文版:寻找一种易于理解的一致性算法

除了课程本身外,如果你还觉得卷地不够爽,那么推荐一本书,可以搭配这门课程一起看,那就是经典的:《DDIA》,全名是《Design Data-Intensive Application》,中文翻译版本名为:《数据密集型应用系统设计》

笔者曾经在工作早期看过几页,奈何功力不够,且内容硬核,遂放弃。现在笔者准备捡起来,努力往后看。

如果确实没有很多时间看视频,也没有关系,已经有大佬把视频内容用文字+图片方式整理出来,以gitbook方式分享了出来。

MIT 6.824 文字+图片整理版本

作者将每一节课拆分成若干小节翻译并整理出来,在翻译的同时还加入了自己的理解,可以说是相当诚意的作品了。

上几张图简单感受一下:

学习建议

简单说一下学习建议。

论文是一定得读的!论文是一定得读的!论文是一定得读的!

重要的话说三遍,因为课堂上,莫里斯教授是以思路讲解和答疑为主的,这都是建立在提前阅读了相关论文资料的前提上开展的,如果压根没有读过相关的论文,那么我相信基本上就是在听天书了。

论文的英文版PDF都能够在课程官网下载到,相关的中译版本也都能通过搜索找到,这里笔者就不提供了,相信有能力的读者都能够自己解决。

课程的schedule页面在 https://pdos.csail.mit.edu/6.824/schedule.html,该页面上提供了所有必须的课程资料链接、论文pdf,以及lab作业的资料,甚至是课程视频,都有链接,读者可以按需求下载。

关于LAB作业

关于如何完成作业,及视频中提到的LAB,笔者简单提供几点建议。

笔者看的版本为2020版本,它的开发语言为Golang,需要学习者提前学习一些go的语法和必须的概念知识。因此开发环境一定需要安装go。莫里斯教授在课堂上也对go语言的设计思想进行了讲解,可以作为参考。

快速学习上手go语言,可以使用以下线上学习指南,你可以在页面上直接写代码并看到直观的运行效果。

https://tour.go-zh.org/welcome/1\

操作系统建议使用类Unix环境(linux、mac均可),使用Windows需要你做额外的工作以去除环境相关的依赖,既繁琐又不一定保证成功。

建议使用Goland作为IDE开发环境,笔者是坚定的JetBrains粉。

结语

题目本身是一种调侃,卷八股文也没什么坏处,尤其是对于换工作的同学而言。

但是从长期看,我们还是需要整理一下自己的知识体系,通过学习一些优秀的论文、课程,做一些有代表性的练习来夯实基础。我想,这应当是破除程序员中年诅咒的方式之一吧。

废话不多说,让我们以梦为马,不负韶华。

学就对了!

(后续笔者也会不定时的发表MIT6.824相关的学习笔记和心得,同时欢迎公众号读者积极投稿,共同交流成长。)



版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

今天来实战一下gRPC的特性,双向流。

首先认识一下,什么是双向流?

所谓双向流式 RPC ,是由客户端调用方法来初始化,而服务端接收到客户端的元数据,方法名和截止时间。

并且服务端可以选择发送回它的初始元数据或等待客户端发送请求的一种通信方式。

双向流,特点在于双向,也就是请求响应如何起作用是完全取决于应用怎么处理,因为客户端和服务端能在任意顺序上读写 ,也就是说这些流的操作是完全独立的。

例如服务端可以一直等待,直到它接收到所有客户端的消息才写应答,或者服务端和客户端可以像”乒乓球”一样:服务端后得到一个请求就回送一个应答,接着客户端根据应答来发送另一个请求,以此类推。

通俗地说,客户端发送了 N 个请求,服务端返回 N 个或者 M 个响应,该特性能够充分利用 HTTP/2.0 的多路复用功能。

某个时刻,HTTP/2.0 链路上可以既有请求也有响应,实现了全双工通信(对比单行道和双向车道),双向流式RPC通信用一个简单的图表示如下:

grpc双向流.png

Read More

本文案例代码地址 : https://github.com/TaXueWWL/grpc-demo

有了前面的铺垫,我们已经对gRPC的java实现机制,代码编写手法、阻塞RPC以及双向流等内容有了全面、直观地了解。

本文我们继续本系列,为我们的gRPC添加服务注册发现。

什么是服务注册发现?

在RPC调用流程中,服务调用方需要知道服务提供方的地址和端口,才能发起RPC调用。

如果是直连式调用,则服务提供方需要提前配置服务提供方的地址和端口,也就是大白话说的 写死

这种硬编码配置方式应对变化的能力很差,如果服务提供方宕机,服务消费者无法及时更换调用的目标,即便服务提供方存在冗余的机器,消费者也需要修改配置文件,重启服务才能调用至新的服务提供方节点。

通俗地说就是,这种方式将服务提供方与服务消费方耦合在了一起,不够灵活。

因此就需要有服务注册发现机制。如下图所示:

registry.png

这里引用了dubbo框架的简易架构图。图中,服务提供方(provider)启动后会向注册中心(Registry)发起服务注册,将自己的ip、端口、其他元数据信息发送给注册中心。

注册中心维护了一个注册表,对上报的服务注册信息进行记录。

服务消费者(consumer)启动后会向注册中心(Registry)拉取服务提供方列表,也就是图中的 subscribe ,即:服务发现过程。

注意看,3.notify 是一条虚线,这里的含义是指,一旦服务提供方的注册信息发生变更,如现有节点下线(有可能是正常的关机,如版本发布;也有可能是意外宕机,都会导致服务下线。)或者新节点上线,都会造成注册中心中记录的服务注册信息发生变更,此时注册中心会通知服务消费者存在注册表信息变更,此时需要对最新的服务注册信息进行变更,一般有几种方式:

  1. 注册中心通过push方式主动推送给消费者,这种方式往往通过消费者向注册中心注册监听器方式实现;
  2. 消费者定时通过pull方式从注册中心拉取注册表信息并在本地进行更新;
  3. 消费者通过长轮询方式从注册中心拉取注册表信息(推拉结合)。

Read More

微服务如火如荼的当下,各种服务框架层出不穷。Dubbo、SpringCloud在国内Java后端微服务领域目前占据大部分份额。

但是随着云原生愈发普及,具备跨语言、高性能特性的RPC通信框架横空出世,其中gRPC与Thrift是其中的佼佼者。

本文我们将视角集中在gRPC这RPC框架。

gRPC 是Google开源的高性能、通用的RPC框架。客户端与服务端约定接口调用, 可以在各种环境中运行,具有跨语言特性, 适合构建分布式、微服务应用。

个人认为,gRPC最为杀手锏的特性就是“跨语言”,其次才是高性能。

它的跨语言特性体现在,通过定义IDL(接口定义语言),隔离了不同编程语言之间的差异,对IDL进行编译后,生成对应编程语言的nativeCode,让开发者能够集中注意在实现业务需求上,而不需要花费额外的精力在语言层面上。

官网的一张图能够很好的体现这个特点

gRPC多语言

Read More

今天的文章,继续学点儿金融知识。重点来了解下金融领域的撮合交易机制。

本文主要介绍撮合交易的概念,委托单相关的知识,以及撮合交易集合竞价与连续竞价相关的要点。

最后讲解撤单相关的知识及止盈止损相关的知识点。

什么是撮合交易?

撮合交易指的是 买方 在交易所下委托买单买入标的,如一手股票,卖方 在交易所下委托卖单卖出标的,如一手股票。

交易所按照价格优先、时间优先原则确定双方成交价格,对符合交易规则的订单进行撮合成交,按交易定单指定的标的物进行交割的交易方式。

撮合是如何成交的?

一般来说,买入和卖出价格是确定的,这种订单叫做限价单,即下单时就指定确定的价格。

买入限价,指的是至多(小于等于)通过该价格成交,买入一定数量的股票。如限价$10, 则可以买入<=$10的股票。

卖出限价,指的至少(大于等于)要通过该价格成交,卖出一定数量的股票,如限价$10,则对手方至少要付出$10买入股票。

Read More

到此,Disruptor高性能之道系列就先告一段落,关于Disruptor的实战使用将会在后续的撮合实战案例中讲解。

本文推荐一些学习Disruptor的资料,感兴趣的读者可以根据这些资料进一步学习。

官网

官网是第一手资料,建议通读

https://lmax-exchange.github.io/disruptor/user-guide/index.html#_using_the_disruptor

并发编程网:disruptor译文

虽然有些过时,但是思想是值得参考的。建议通读

http://ifeve.com/disruptor/

ifeve.PNG



版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

Fork me on GitHub