自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(372)
  • 资源 (1)
  • 收藏
  • 关注

原创 RabbitMQ~架构、能力、AMQP、工作模式、高可用、死信队列了、事务机制了解

RabbitMQ是使用Erlang编写的一个开源的消息中间件。它实现了AMQP(高级消息队列协议),并支持其他消息传递协议:例如STOMP(简单文本定向消息协议)和MQTT(物联网协议)。支持多种客户端如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用用性等方面表现不俗。本身支持很多的协议:AMQP,MQTT,XMPP, SMTP, STOMP,也正是如此,使的它变的。

2024-09-01 21:27:07 1819 4

原创 RocketMQ~5.0新特性,POP消费模式

在 RocketMQ 5.0 中,POP 模式(Pseudo-synchronous Offload Processing,伪同步卸载处理)是一种新的消费模式。它结合了Pull和Push模式的优点,。

2024-08-25 23:38:06 734 1

原创 RocketMQ~刷盘机制、主从复制方式、存储机制

生产者发布MQ给Brocker,Brocker在存储这些数据的时候,需要进行刷盘,分为同步刷盘和异步刷盘。在同步刷盘中需要等待一个刷盘成功的ACK,同步刷盘对MQ消息可靠性来说是一种不错的保障,但是性能上会有较大影响,一般地适用于金融等特定业务场景。而异步刷盘往往是开启一个线程去异步地执行刷盘操作。消息刷盘采用后台异步线程提交的方式进行,降低了读写延迟,提高了MQ的性能和吞吐量,一般适用于如发验证码等对于消息保证要求不太高的业务场景。

2024-08-25 22:32:40 1067

原创 RocketMQ~高性能设计与实现(零拷贝技术)、多种集群模式

与Kafka类似,RocketMQ也使用了零拷贝技术、对于分区,其也有分队列的思维在。

2024-08-25 18:13:39 631

原创 RocketMQ~重复消息、消息堆积、回溯消费、如何防止消息不丢失

我们需要给我们的消费者实现幂等解决重复消息,也就是对同一个消息的处理结果,执行多少次都不变。这个还是需要结合具体的业务的。你可以使用写入Redis来保证,因为Redis 的 key 和 value 就是天然支持幕等的。当然还有使用用数据库插入法,基于数据库的唯一键来保证重复数据不会被插入多条。不过最主要的还是需要,你要知道你的消息消费是否是完全不可重复消费、还是可以忍受重复消费的,然后再选择强校验和弱校验的方式。

2024-08-25 17:31:09 1063

原创 RocketMQ~生产者使用建议、消费者的消费模式(pull or push)、消息分发

Apache RocketMQ的生产者和主题是多对多的关系,支持同一个生产者向多个主题发送消息。对于生产者的创建和初始化,建议遵循够用即可、最大化复用原则,如果有需要发送消息到多个主题的场景,无需为每个主题都创建一个生产者。Apache RocketMQ的生产者是可以重复利用的底层资源,类似数据库的连接池。因此不需要在每次发送消息时动态创建生产者,且在发送结束后。这样频繁的创建销毁会在服务端产生大量短连接请求,严重影响系统性能。

2024-07-14 18:16:04 779

原创 RocketMQ~消息的种类与生命周期(普通消息、延时&定时消息、顺序消息、事务消息)

普通消息一般应用于微服务解耦、事件驱动、数据集成等场景,这些场景大多数要求数据传输通道具有的能力,且对消息的没有特别要求。以在线的电商交易场景为例,上游订单系统将用户下单支付这一业务事件封装成独立的普通消息并发送至 RocketMQ 服务端,下游按需从服务端订阅消息并按照本地消费逻辑处理下游任务。每个消息之间都是相互独立的,且不需要产生关联。另外还有日志系统,以离线的日志收集场景为例,通过埋点组件收集前端应用的相关操作日志,并转发到 RocketMQ。

2024-07-14 17:36:46 1203

原创 RocketMQ~架构与工作流程了解

RocketMQ 具有的特点。它是一个采用 Java 语言开发的分布式的消息系统,由阿里巴巴团队开发,在 2016 年底贡献给 Apache,成为了 Apache 的一个顶级项目。在阿里内部,RocketMQ 很好地服务了集团大大小小上千个应用,在每年的双十一当天,更有不可思议的万亿级消息通过 RocketMQ 流转。对于主题模型的实现来说每个消息中间件的底层设计都是不一样的,就比如 Kafka 中的 分区 ,RocketMQ 中的 分队列 ,RabbitMQ 中的 Exchange。

2024-07-13 18:18:09 1296

原创 Kafka~高吞吐量设计

我挑几个比较重要的讲一讲。

2024-06-30 22:15:59 553

原创 Kafka~特殊技术细节设计:分区机制、重平衡机制、Leader选举机制、高水位HW机制

Kafka 的分区机制是其实现高吞吐和可扩展性的重要特性之一。Kafka 中的数据具有三层结构,即主题(topic)-> 分区(partition)-> 消息(message)。一个 Kafka 主题可以包含多个分区,而每个分区又可以包含多条消息。Topic和Partition是kafka中比较重要的概念。

2024-06-30 17:54:50 704

原创 Kafka~消息系列问题解决:重复消费问题、消费重试机制、消息积压问题

那么这里会有个问题:什么时候提交 offset 合适?在Kafka中,有三种常见的消息传递语义:At-least-once、At-most-once、Exactly-once。其中At-least-once和Exactly-once是最常用的。At-least-once消费语义意味着消费者至少消费一次消息,但可能会重复消费同一消息。在At-least-once语义中,。这意味着该消息将在下一次重试时再次被消费。

2024-06-30 13:56:29 3683 2

原创 Kafka~消息系列问题解决:消费顺序问题解决、消息丢失问题优化(不能保证100%)

假如这两条消息的消费顺序不一样造成的最终结果就会截然不同。我们知道 Kafka 中 Partition(分区)是真正保存消息的地方,我们发送的消息都被放在了这里。而我们的 Partition(分区) 又存在于 Topic(主题) 这个概念中,并且我们可以给特定 Topic 指定多个 Partition。每次添加消息到 Partition(分区) 的时候都会采用尾加法。Kafka。消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。

2024-06-29 22:58:53 1114

原创 Kafka~消息发送过程与ISR机制了解

同步发送时,可以在发送消息后,通过get方法等待消息结果,这种情况能够准确的拿到消息最终的发送结果,要么是成功、要么是失败。而异步发送,是采用了callback的方式进行回调的,可以大大的的提升消息的吞吐量,也可以根据回调来判断消息是否发送成功。

2024-06-29 22:47:17 1112

原创 Kafka~基础原理与架构了解

Kafka我们了解一直认为是一个消息队列,但是其设计初,是一个:分布式流式处理平台。

2024-06-23 18:22:04 1225 1

原创 MQ~消息队列能力、AMQP协议、现有选择(Kafka、RabbitMQ、RocketMQ 、Pulsar)

RabbitMQ 在吞吐量方面虽然稍逊于 Kafka、RocketMQ 和 Pulsar,但是由于它基于 Erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为 RabbitMQ 基于 Erlang 开发,所以国内很少有公司有实力做 Erlang 源码级别的研究和定制。如果业务场景对并发量要求不是太高(十万级、百万级),要求极高的低延迟,那这几种消息队列中,RabbitMQ 你可以选择使用。RocketMQ 和 Pulsar 支持强一致性。

2024-06-22 16:01:00 1350

原创 MongoDB~分片数据存储Chunk;其迁移原理、影响,以及避免手段

Chunk(块) 是 MongoDB 分片集群的一个核心概念,其本质上就是由一组 Document 组成的逻辑数据单元。每个 Chunk 包含一定范围片键的数据,互不相交且并集为全部数据。如上图,假设集合的shardKey x(以范围分片为例,哈希分片类似),写入该集合的文档根据其x的取值范围,会被分散到chunk1到chunk4中,每个chunk只包含特定范围的数据(比如chunk2就只包含x的取值在[-75, 25)范围内的文档),

2024-06-16 16:23:33 1687 1

原创 MongoDB~高可用集群介绍:复制集群(副本集)、分片集群

MongoDB 的集群主要包括副本集(Replica Set)和分片集群(Sharded Cluster)两种类型。组成:通常由一个主节点(Primary)和多个从节点(Secondary)构成。

2024-06-16 14:46:41 1551

原创 MongoDB~事务了解;可调一致性模型功能与因果一致性模型功能分析

MongoDB 从 3.0版本引入,MongoDB 3.6之前的版本只能支持单文档的事务,从 MongoDB 4.0版本开始支持复制集部署模式下的事务,从 MongoDB 4.2版本开始支持分片集群中的事务。

2024-06-15 20:03:04 963

原创 MongoDB~索引使用与优化

如果你把数据库类比为一本书,那书的具体内容是数据,书的目录就是索引,所以索引的目的和作用,就是为了提高数据的查询效率。和关系型数据库类似,MongoDB 中也有索引。如果没有索引的话,MongoDB 必须执行集合扫描 ,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在合适的索引,MongoDB 可以使用该索引来限制它必须检查的文档数量。并且,MongoDB 可以使用索引中的排序返回排序后的结果。虽然索引可以显著缩短查询时间,但是使用索引、维护索引是有代价的。

2024-06-02 21:32:51 1335

原创 MongoDB~俩大特点管道聚合和数据压缩(snappy)

在MySQL中,通常会涉及多个表的一些操作,MongoDB也类似,有时需要将多个文档甚至是多个集合汇总到一起计算分析(比如求和、取最大值)并返回计算后的结果,这个过程被称为。

2024-06-01 16:56:18 1033

原创 MongoDB~存储引擎了解

存储引擎是一个数据量的核心,主要负责内存、磁盘里数据的管理和维护。MongoBD的优势,在于其数据模型定义的灵活性、以及可拓展性。但不要忽略,其存储引擎也是插件式的存储,支持不同类型的存储引擎,使用不同的引擎可以解决不同场景的问题,也支持用户去自定义实现存储引擎。在设计之初,为了实现server与物理存储的解耦,引入存储引擎作为中间插件,类似于MySQL的:基于B+Tree的InnoDB引擎和基于LSM树的RocketsDB引擎,还有快速写入和读取的MyISAM引擎。目前MongoDB主要有俩种引擎。

2024-06-01 16:02:21 1075

原创 MongoDB~基础知识记录

工作以来,使用最多、了解最多的是MySQL。所以学习Mongodb就是为了其的:高可扩展、高性能和高可用虽然目前已经发展到7版本,但使用最多的是还是4开头的版本,再者是5开头的版本,在我眼里,主要原因还是4开头的版本支持了分布式的事务,能力已经足够,无需再去冒险升级扩展。所以我学习的也是4.x版本。

2024-06-01 15:04:54 1183

原创 Go~并发之GMP原理与调度

文章目录前言routine与线程的关系N:1关系1:1关系M:N关系Go 语言的协程 goroutineGo中的调度器被废弃的 goroutine 调度器Goroutine 调度器的 GMP 模型的设计思想GMP 模型P 和 M 的个数问题P 和 M 何时会被创建调度器的设计策略go func () 调度流程调度器的生命周期代码示例分析可视化 GMP 编程Go 调度器调度场景过程全解析前言看这篇文章,请确保你已经熟悉进程、线程、协程等相关概念。并熟悉了操作系统常用的线程调度方式。并对并发和并行有一定

2022-04-10 16:29:17 1632

原创 Go~并发编程runtime、workerPool、timer、ticker、sync、atomic

文章目录前言并发的一些概念进程和线程并发和并行协程和线程runtime包runtime.Gosched()runtime.Goexit()runtime.GOMAXPROCSGoroutine池(Pool)worker pool(goroutine池)定时器Timer(只执行一次)Ticker(时间到了多次执行)并发安全和锁(Sync)sync.WaitGroup互斥锁(sync.Mutex)读写互斥锁(sync.RWMutex)惰性初始化(sync.Once)加载配置文件示例闭包下的惰性加载sync.Ma

2022-03-27 22:39:01 873

原创 Go~实现自定义Error返回体

error接口假设你就已经创建和使用过神秘的预定义error类型,但是没有解释它究竟是什么。实际上它就是interface类型,这个类型有一个返回错误信息的单一方法:// The error built-in interface type is the conventional interface for// representing an error condition, with the nil value representing no error.type error interface {

2022-03-27 10:51:48 1329

原创 艺术~如何设计一套优秀的API响应体

文章目录前言参考HTTP状态码优秀的设计进行分段处理个性化Message额外的好处前言客户端请求API,通常需要通过返回码来判断API返回的结果是否符合预期,以及该如何处理返回的内容等.有的API用返回码是int类型,有的是string类型,有的用0表示成功,又有的用1表示成功,还有用“true”表示成功,碰上这种事情,只能说:沟通起来真头疼。API返回码的设计还是要认真对待,毕竟好的返回码设计可以降低沟通成本以及程序的维护成本。参考HTTP状态码以HTTP状态码为例,为了更加清晰的表述和区分状

2022-01-26 11:55:18 738

原创 艺术~对走向前后端分离的理解

文章目录前言前端MVVM架构对开发人员而言对于后端工程师对于前端工程师不分离时耦合的痛点前言截止目前,所有的新项目都优先推荐使用前后端分离的架构,在前端使用MVVM模式,后端使用分布式部署或者使用简单的MVC单体架构。所以前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。核

2022-01-15 22:56:24 1816

原创 Go~从基础快速入门到代码案例分析

文章目录GO一 前言1.1 为什么是Go1.2 Go有缺点吗Go执行流程二 基础类型1.1 数据类型1.2 特殊占位符1.3 常量1.3.1 使用和注意事项1.4 指针1.5 值类型和引用类型三 Go分支结构3.1 for循环3.2 range遍历3.3 switch四 函数4.1 函数内存分布4.2 不定参数函数4.3 多返回值函数4.4 可命名返回值函数4.4.1 defer函数修改命名返回值4.5 函数参数为指针4.6 函数类型4.7 函数调用机制4.8 函数作为参数4.9 init函数4.9 匿名函

2022-01-06 16:50:37 1342

原创 Go~Golong容器大集合, 包括Slice、Map、Heap、List、Ring

文章目录前言Slice1.1 创建切片1.2 理解数组指针1.3 自动扩容1.4 字节切片1.5 copy()函数1.6 sort.slice()排序1.7 切片的坑Map2.1 声明&初始化2.2 常用操作2.2.1 长度和容量2.2.2 添加2.2.3 修改2..2.4 删除2.2.5 查看2.2.6 嵌套2.2.7 变量赋值2.3 Map底层原理剖析2.3.1 初始化2.3.2 写入数据2.3.3 读取数据2.3.5 修改数据2.3.6 扩容2.3.5 迁移翻倍扩容等量扩容2.4 Map的坑H

2021-12-11 23:34:45 1531 2

原创 Java~阅读《深入理解Java虚拟机》知识点总结

文章目录前言第一部分(Java程序内部机制)1.1Java运行时一个类是什么时候被加载的?1.2JVM一个类的加载过程?1.3一个类被初始化的过程的注意点1.4继承时父子类的初始化顺序是怎样的?1.5究竟什么是类加载器?1.6JVM有哪些类加载器?1.7JVM中不同的类加载器加载哪些文件?1.8JVM三层类加载器之间的关系是继承吗?1.9你了解JVM类加载的双亲委派模型吗?1.10JDK为什么要设计双亲委派模型,有什么好处?1.11可以打破JVM双亲委派模型吗?如何打破JVM双亲委派模型?1.12如何自定义

2021-12-01 20:52:31 2437 25

原创 Golong~最新Windows下Go环境+Go mod搭建, 介绍GOROOT、GOPATH、GOPROXY之间关系

文章目录前言搭建Go环境Goland下载Golong的SDK下载环境变量配置搭建GO mod环境初始化Go mod项目GOROOT、GOPATH、GOPROXY之间关系GOROOT介绍GOPATH介绍Go Modules的诞生GOPROXY介绍前言本人环境是windows10+Goland2020.3.4+Go版本是1.17.3大家如果只是单纯学习Go语言,只需要搭建Go环境就可以, 如果是想开发一个项目的话,目前主流公司都是使用Go mod的形式, 如果你学过java的话,这个Go mod和jav

2021-11-14 00:15:38 3672 1

原创 一个高考失利人的2022届秋招复盘,目前收到腾讯 字节 百度 阿里 京东的offer

文章目录一个高考失利人的2022届秋招复盘,目前收到腾讯 字节 百度 阿里 京东的offer前言本人情况和秋招结果战绩大学时间线安排大一大二举一些面试例子数据结构和算法如何考?如何学习这部分知识网络原理如何考?如何学习这部分知识数据库如何考?如何学习这部分知识操作系统如何考?如何学习这部分知识最重要的Java如何学?大三上学期找实习实习的重要性如何准备简历简历如何投递?方式一(三方软件投递)方式二(官网投递)方式三(内推)如何为面试准备?面试流程笔试面试笔试和面试中需要注意哪些?下学期参加秋招参加校招提前批

2021-11-05 17:11:58 6878 21

原创 艺术~为减少字符设计的短URL服务

设计原因之前需要写一个告警服务,告警需要一短信的方式通知对方,并且在短信中要给到监控报告的URL地址, 但是发送短信需要调用三大运营商的接口,短信息有字数限制的,发送一条短信最多七十个字,160个英文或数字字符,或者70个中文字符,也就说,你每次发信息,你发送超过70字的短信是按2条记费的,超过140个字按3条记费,依次类推。设计好处减少短信内容,为公司降低开销好看。 比起一大堆不知所以的参数,短链接更加简洁友好。安全。 不暴露访问参数。核心原理其实本质就是把长的url做一个映射, 变成

2021-07-17 13:28:13 197

原创 Go~复合数据类型,数组、Slice、Map、结构体

文章目录数组Sliceappend函数copy函数Slice内存技巧Map结构体结构体字面值结构体比较结构体嵌入和匿名成员数组数组的长度是固定的,因此在Go语言中很少直接使用数组。和数组对应的类型是Slice(切片),它是可以增长和收缩的动态序列,slice功能也更灵活,但是要理解slice工作原理的话需要先理解数组。数组的每个元素可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。内置的len函数将返回数组中元素的个数。var a [3]int // ar

2021-05-05 21:34:26 1428

原创 Go~基本数据类型,整型、浮点型、复数、布尔型、字符串、常量

文章目录整型浮点数复数布尔型字符串常量整型Go语言同时提供了有符号和无符号类型的整数运算。这里有int8、int16、int32和int64四种截然不同大小的有符号整数类型,分别对应8、16、32、64bit大小的有符号整数,与此对应的是uint8、uint16、uint32和uint64四种无符号整数类型。还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint;其中int是应用最广泛的数值类型。这两种类型都有同样的大小,32或64bit,但是我们不能对此做任何的假设;因为不同的

2021-05-05 21:03:34 669

原创 Go~简介与特性

文章目录Go语言简介Go 是编译型语言Go的特点语法简单并发模型内存分配垃圾回收静态链接标准库工具链为并发而生的Go语言Go语言简介Go语言不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。可以进行网络编程、系统编程、并发编程、分布式编程。具有“部署简单、并发性好、语言设计良好、执行性能好”等优势。Go 从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想。因为Go语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过

2021-05-05 20:05:03 392

原创 Java~新时代程序员的编码风格:lambda表达式、函数式接口、Stream流式计算、链式编程、异步调用

文章目录前言Lambda表达式前言如果有同学去逛一些新出来的开源项目和框架,你肯定会看到大量的lambda表达式、函数式接口、链式编程、Stream流式计算。所以现在如果还不熟悉这几个技术,你就会发现看源码非常吃力。Lambda表达式基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }Lambda表达式由三部分组成:paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类

2021-04-02 09:10:45 742

原创 艺术~在单机和分布式环境下的限流算法(漏桶算法、令牌桶算法)

文章目录前言限流算法滑动窗口限流漏桶算法令牌桶算法单机限流和分布式限流限流组件前言今天总结学习一下限流的相关内容,包括常见的限流算法、单机限流场景、分布式限流场景以及一些常见限流组件。那就引来第一个问题,什么是限流?为什么要限流?首先来解释下什么是限流?在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000 个人能进去游玩。这就是一个限流,那么再来回答第二个问题为什么要限流?依旧刚刚那个例子,如果不限流会怎么样,就会把景区挤爆。那换在

2021-03-30 10:10:22 728

原创 数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,时间复杂度均为O(1))

文章目录前言LRU实现使用LinkedHashMap实现自己实现LRU前言比如我们在使用Redis中如果出现内存不够的时候,它会有一个内存淘汰策略,比如Random和LRU和LFU,而且我们使用最多的也就是LRU,所以我今天讲讲这个是如何实现的。LRULRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。新数据插入到链表头部;每当缓存命中(即缓存数据被访问),则将数据移到链表头

2021-03-27 22:44:49 602

原创 数据结构~倒排索引算法(InnoDB全文索引的实现原理)

文章目录前言基本概念文档文档集合文档编号单词编号倒排索引单词词典倒排文件倒排列表前言在各大搜索引擎中,输入关键字都可以找到我们想要的文章,还有InnoDB引擎中的全文索引,为什么能提高大量数据的检索,他们都有个共同的原因就是底层都是倒排索引算法。我们先了解一些基本概念。基本概念文档一般搜索引擎的处理对象是互联网网页,而文档这个概念更要宽泛一些,代表以文本形式存在的存储对象。相比于网页来说,涵盖更多形式,比如Word、PDF、html、XML等不同格式的文件都可以称为文档,再比如一封邮件、一条短

2021-03-26 13:16:59 1037 1

用java实现操作系统实验银行家算法

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系 统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。 要解释银行家算法,必须先解释操作系统安全状态和不安全状态。 安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

2020-05-26

空空如也

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

TA关注的人

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