自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RabbitMQ消息可靠性保证机制3--消费端ACK机制

可以保证数据成功的发送到RabbitMQ,以及持久化机制,然尔这依然无法完全保证整个过程的可靠性,因为如果消息被消费过程中业务处理失败了,但是消息却已经被标记为消费了,如果又没有任何重度机制,那结果基本等于丢消息。由于消息被不断的重新放回队列,而消费者又只有当前这一个,所以,在不断拒收中被放回。从观察到的结果也印证了,反复的被推送,接收的一个过程中,使用命令查看队列的一个消费的情况。通过观察发现,消息已经没有在队列中了,那就是消息已经被丢弃了。在浏览器中访问,同样有66%的概率会被拒绝,仅33%会被确认。

2024-01-07 21:28:32 1347

原创 RabbitMQ消息可靠性保证机制2--持久化存储机制

RabbitMQ通过配制queue_index_embed_msgs_below可以根据消息大小决定存储位置,默认queue_index_embed_msgs_below是4096字节(包含消息体、属性及headers),小于该值的消息都存在rabbit_queue_index中。在重启之后,非持久化的消息队列已经没有了,而定义为持久化的消息交换器、队列和消息都还是存在的。这里存在两个队列,一个是持久化的队列, 一个是非持久化的消息队列。在文件内容中,还有检查到发送的数据内容: hello world。

2024-01-07 21:26:07 620

原创 RabbitMQ消息可靠性保证机制--发送端确认

​ RabbitMQ后来引入了一种轻量级的方式,叫发送方确认(publisher confirm)机制,生产者将信息设置成confirm(确认)模式,一旦信道进入了confirm模式,所有在该信道上面发送的消息都会被指派成一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后(如果消息和队列是持久化的,那么消息会在消息持久化后发出),RabbitMQ就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一的ID),这样生产者就知道消息已经正确送达了。

2023-09-24 19:52:38 283

原创 SpringBoot整合RabbitMQ

引入SpringBoot的父类</</</</maven的导入</</</</</</</</</</</</</</

2023-09-21 20:07:57 268

原创 Spring整合RabbitMQ-注解方式

maven导入</</</</提示:ConnectionFactory有三个实现CachingConnectionFactory 基于channel的缓存模式 最常用是这个。LocalizedQueueConnectionFactory 直接连接某个节点的方式。如果是集群,此种不太适合。SimpleRoutingConnectionFactory 在当前的连接工厂中按查找的KEY获取连接工厂。运行消息的生产者,查看消息发送信息通过检查发现,消息已经成功的发送到了队列运行主程序,检查控制台的输出。

2023-09-12 22:09:27 587

原创 Spring整合RabbitMQ-配制文件方式-3-消息拉模式

当启动消费者后,便可获取到发送至队列的消息。经过检查确认,发现消息已经被消费了。至此拉模式的消费者完成。

2023-09-05 21:51:28 473

原创 Spring整合RabbitMQ-配制文件方式-2-推模式消费者

除消息外,还提供了Channel这个对象,通过channel可以有更大的灵活性。再观察消息者,便能看到消费者队列中已经收到了发送的消息。这样监听者就会处于监听状态。普通的场景基本够用。在推模式中消息的即时性比拉模式会好。再启动生产者,向队列中发送消息。

2023-09-05 21:49:28 551

原创 Spring整合RabbitMQ-配制文件方式-1-消息生产者

Spring-amqp是对AMQP的一些概念的一些抽象,Spring-rabbit是对RabbitMQ操作的封装实现。主要有几个核心类等类完成对Exchange、Queue、Binding的操作,在容器中管理 了类的时候,可以对Exchange、Queue、Binding进行自动声明。类是发送和接收消息的工具类。是消费消息的容器。目前一些比较新的项目会使用基于注解的方式,而比较老的一些项目可能还是基于配制文件的方式。

2023-09-05 21:46:05 583

原创 RabbitMQ工作模式-主题模式

top类型的交换器背后原理跟direct类型类似只要队列的bingingkey的值与消息的routingKey的匹配,队列就可以收到该消息。使用topic类型的交换器,队列绑定到交换器、bingingKey时使用通配符,交换器将消息路由转发到具体队列时,会根据消息routingKey模糊匹配,比较灵活。使用topic类型的交换器, routingKey就不能随便写了,它必须是点分单词,单词可以随便写,一般按消息的特征,该点分单词字符串最长255字节。观察可以发现,此队列与消息的绑定已经成功。

2023-08-30 21:57:54 456

原创 RabbitMQ工作模式-路由模式

官方文档参考:https://www.rabbitmq.com/tutorials/tutorial-four-python.html。即按日志不同的级别,分发到不同的队列。每个队列只处理自己的对应的级别日志。类型的Exchange,发N条消息并使用不同的routingKey,消费者定义队列并将队列。完成匹配的情况下消息才会转发到对应的队列中被消费。启动消费者,查看消息通否被正常消费。ERROR的消费者控制台输出。创建WARN级别的消息者。创建ERROR的消费者。创建INFO级的消费者。

2023-08-30 21:55:29 1093

原创 RabbitMQ工作模式-发布订阅模式

应该是追加到一个指定的队列,还是追加到多个队列,还是丢弃。每个消费者定义生成一个队列关绑定到同一个Exchange,每个消费者都可以消费完整的消息。在RabbitMQ中,生产者不是将消息直接发送给消息消息队列,实际上生产者根本不知道一个消息被发送到哪个队列。当启动生产者后,可以发现已经产生了3个默认的交换机及队列的绑定关系。交换器很简单,从名称就可以看出来(用风扇吹出去),将所有的收到的消息发给它的知道的所有队列。此样例使用的是临时队列,即消费都实现将自动创建此队列,当消费都退出后,此队列也将自动删除。

2023-08-30 21:51:56 567

原创 RabbitMQ工作模式-工作队列

官网关于工作模式的解释地址:https://www.rabbitmq.com/getstarted.html。

2023-08-30 21:37:09 906

原创 RabbitMQ-常用命令

rabbitmq-常用命令使用

2023-08-26 16:13:08 3653

原创 linux RabbitMQ-3.8.5 安装

当启用rabbitmq_management插件时,自动启动了依赖的rabbitmq_management_agent插件和rabbitmq_web_dispatch。RabbitMQ安装需要依赖:socat和logrotate,logrotate操作系统已经存在了,只需要安装socat就可以了。RabbitMQ的安装首先需要安装Erlang,因为它是基于Erlang的VM运行的。http://<安装RabbitMQ的机器的IP>:15672。至此RabbitMQ的安装就已经完成。登录成功后,可以看到。

2023-08-19 15:41:33 809

转载 解决因jdk版本问题不支持aes256加密问题(Illegal key size or default parameters)

想必大家遇到aes256加密报如下异常:java.security.InvalidKeyException: Illegal key size or default parameters,在网上搜到最多的解决方案是在oracle官网下载补丁jar包(local_policy.jar、US_export_policy.jar),进行替换。当然,如果这个一个新项目,或者项目规模较小,完全可以通过替换对应jar包,或者升级jdk的版本来解决。但对于一个规模较大,稳定运行的项目,替换jar包可能意味着将系统推向潜

2022-05-18 12:51:14 2507

原创 避免递归查询的树形结构的表设计与实现

解决数据库递归树的问题

2022-04-16 17:46:03 994

原创 使用redis进行分布式加锁实现

1 redis分布式加锁现在业务并发量越来越大,像传统的数据库操作,已经不能满足要求了,这个时候可以使用redis来提升性能,同时也可以使用redis实现分布式锁。使用redis实现分布式锁,与java的synchronize类似,只不过是synchronize锁单对象,而分布式锁是锁进程或者线程,同样的它是一个独占锁,一旦被某个线程拿到锁,其他的线程或者进程,只能进行等待后再获取。当线程或者进程使用完毕释放锁后,其他线程才能获取到锁。下面将基于redis实现一个分布式锁。代码实现先看Redis的

2021-05-30 13:01:51 459

原创 使用数据库进行分布式加锁实现

1.使用数据库进行分布式加锁行锁以mysql为例,进行举例 :1.1 for update在mysql中使用for update获得行锁。for update是一种行级锁,又叫排它锁,一旦用户对某个行施加了行级锁,则该用户可以更新也可以查询也可以更新被加锁的数据行,其他用户只能查询,不能更新被加锁的数据行,如果其他用户想更新该表中的数据行,则也必须对表施加行级锁。释放行级:1.执行提交commit语句.2.退出数据库3.程序停止运行.通常情况下,select语句是不会对数据加锁的,妨碍影响

2021-05-25 20:27:13 569 3

原创 总结JAVA中的锁

总结JAVA中各种锁的使用1. 为什么要使用锁?​ 拿个生活中的示例来说明这个问题吧,某超市做促销,菜仔油半价卖,35块钱一桶。这消息一出必然会有很多的人抢购。但菜仔油不是无限供应的,超市通常会把菜仔油放到一个地方,每次放进去一个或者两个人。这些人先购结束了,再放下一波人,直到油卖光了,就结束了。类比卖超市,想像下单程序是不是也是这样子呢,我们的客户通过网页或者手机下单商品。服务器在收到请求后都需要进行扣减库存操作。当非常多的客户同时下单了某一个商品。这样导致大量的请求都需要去扣库存。这时候我们

2021-04-23 09:11:02 202

原创 java实现异步非阻塞的几种方式-消息中间件

java实现异步非阻塞的几种方式-消息中间件4. 消息中间件在前面已经实现了异步调用、接口回调两种形式,都较为复杂,需要自己控制多线程,那有没有简单点的方式来实现异步的消息通讯。这个当然是有的,可以使用消息中间件的形式,来实现整个消息的异步调用。还是以订单这个场景为示例来举个粟子。4.1 样例代码我的样例程序使用rabbitmq来做为消息队列传输数据,其他消息队列功能类似。先从订单服务开始。@RestController@RequestMapping("/order")public cla

2021-03-23 22:17:03 594

原创 java实现异步非阻塞的几种方式-接口回调

java实现异步非阻塞的几种方式-33. 接口回调在异步阻塞的调用过程中线程还是会存在于阻塞中。等待响应的结果,那能不能在发起请求后就不再关心这个逻辑,而执行其他的任务呢?那就要用到callback机制。还是以订单查询为示例。先来说下整个的调用链吧。当这个异步回调机制加入之后,原来order的等待的结果的响应就不存在,可以做其他的事情去了,等着其他用户和商品服务完成之后,调用即可。3.1 样例代码订单服务的代码:@RestController@RequestMapping("/order"

2021-03-14 22:45:28 918

原创 java实现异步非阻塞的几种方式-异步调用

java实现异步非阻塞的几种方式-2异步调用,就相关于将原来同步调用的代码块放置到一个又一个的线程中去执行,这样就可以并行的执行相关的任务。也就不用卡在一个点的等待,进而影响后续的任务。还以是订单为示例,演示整个调用的过程。2. 异步调用2.1 样例代码首先加入的就是线程池public class ScheduleTaskThreadPool { /** 进行任务调度的线程池对象 */ public static final ScheduleTaskThreadPool INSTANCE

2021-03-14 22:42:55 1644

原创 java实现异步非阻塞的几种方式-同步阻塞调用

java实现异步非阻塞的几种方式-11. 同步阻塞调用在讲异步非阻塞之前还是先来说明同步阻塞的调用吧。明白了同步阻塞的调用,才能更好的明白异步非阻塞的调用。以一个示例来说明吧,这是一个非常常见的程序间的调用。我们的程序对外提供当前的用户的订单详细查询的接口,订单接口先调用用户服务,获取当前的用户信息;再调用商品接口获取商品的详细信息。就以这样一个示例程序来说明吧。假设这个订单服务调用用户服务的时间是2秒,调用商品服务的时间是3秒,订单服务自身的处理时间是1秒,那整个处理流程所需的时间就是2+3+

2021-03-14 22:38:49 537

原创 性能测试工具-WRK

性能测试工具-WRK使用1.简介wrk是一款针对http协议的基准测试工具,它能够在单机多核CPU的条件下,使用系统自带的高性能 I/O机制,如epoll,kqueue等,通过多线程和事件模式,对目标机器产生大量的负载。2.优劣势2.1优势:轻量级性能测试工具;安装简单(相对 Apache ab 来说);学习曲线基本为零,几分钟就能学会咋用了;基于系统自带的高性能 I/O 机制,如 epoll, kqueue, 利用异步的事件驱动框架,通过很少的线程就可以压出很大的并发量;2.2劣势:

2021-03-07 14:03:22 948

原创 java调用shell脚本和命令-ProcessBuilder方式

java调用shell脚本和命令-ProcessBuilder方式在上一节中,我使用Runtime的方式,实现了对命令行和脚本文件的运行。最后我留下了一个小小的问题那就是这个InputStream和errorStream需要分开获取,那有没有其他方,不用分开获取流呢?1.相关文档答案当然是有的,这就是这章节要使用的ProcessBuilder方式了。同样的,也先看下ProcessBuilder的API吧。类用于创建操作系统进程。每个 ProcessBuilder 实例管理一个进程属性集。sta

2021-02-28 22:53:39 4717 6

原创 leetcode 599. 两个列表的最小索引总和 求解思路

leetcode 599. 两个列表的最小索引总和 求解思路先来看下题目:599. 两个列表的最小索引总和假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。示例 1:输入:["Shogun", "Tapioca Express", "Burger King", "KFC"]["Piatti", "

2021-02-28 11:51:39 208

原创 Java调用Shell命令和脚本-Runtime方式

java运行shell脚本和命令-Runtime方式使用java调用命令行在项目的开发中经常会使用到,在我最近的一个项目中,也使用到了java调用命令和shell脚本。我将用这篇文章记录下来java调用命令行的实现。这个是java中使用最多的一种方案吧,对于Runtime在JAVA的API中是这样解释的:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。应用程序不能创建自己的 Runtime 类实例。

2021-02-27 16:42:26 1442 6

原创 leetcode 599. 两个列表的最小索引总和 求解思路

先来看下题目:599. 两个列表的最小索引总和假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。示例 1:输入:["Shogun", "Tapioca Express", "Burger King", "KFC"]["Piatti", "The Grill at Torrey Pines", "Hu

2021-02-26 09:09:19 215

原创 一致性哈希算法

一致性哈希算法一. 传统的哈希算法的局限性要了解一致性哈希算法,就得先了解传统的哈希算法在分布式场景下的局限性。哈希算法就是按键值对的存储,给定一个键,可以做到O(1)的时间复杂度内的数据查找。例如根据学生的学号查找学生的相关的信息。一种简单的存储形式就是以哈希表的形式来存储<code,studentinfo>。假如某个学校的学生太多了。一台机器上的哈希表已经存储不了。需要使用多台机器来进行存储学生信息,那这时该怎么办呢?这个最简单的办法就是使用哈希取模来确定,计算公式如下节点编号=h

2021-02-21 18:53:53 699

原创 java踩坑之线程池

java踩坑之线程池就有前几天刚完成的大型对比时使用到了线程池,对于线程池,我想我有好多踩过的坑的经历,这也就是所说的经验吧,我想通过这篇文章,将我所踩过的坑,都记录下来.坑1-newFixedThreadPool程序问题演示:这是jdk提供的一个默认线程线程池的实现。创建一组固定大小的线程池,来运行任务。当时这个任务是用来运行后台的异步发送通知任务。每秒大约100个发送量,高峰时段大约500个发送量,量并不大。但有一天通知服务突然宕机了,而我们服务调用超时的时间是2分钟,结果就导致我们的服务出现了

2021-02-17 13:21:12 957 1

原创 单台机器上实现TB级的数据对比之数据合并

在单台机器上实现TB级的数据对比之数据合并整体思路在上一章节,我介绍了如何对切分后的数据进行并行排序,这节来到了最后的操作,数据的合并操作。将数据进行对比,找出添加的数据、修改的数据、删除的数据。需要特别处理下重复的数据。在第一章节我已经介绍了这个大致的思路,但未深入细节来讨论如何实现,这章将深入细节将数据合并的逻辑做一个完整的说明。这个逻辑看着有点复杂吧,那我来详细的解释下吧!在原始排序文件中读取所有文件的首行数据,并记录到以文件索引为下标的数组中。就叫它srcDataList在目标排

2021-02-17 09:50:30 326

原创 单台机器上实现TB级的数据对比之数据排序

在单台机器上实现TB级的数据对比之数据排序整体流程在上一个章节已经实现了对大型文件的拆分.今天来继续分享关于数据的排序。文件排序的逻辑不复杂。将数据读取进内存中然后排序。写入至磁盘中。由于这些文件相互完全不关联。可以并行化处理。那先还是看下整体的一个结构吧。这个主要涉及到以下内容:并行排序控制器,它的主要作用是控制向线程池中加入任务的数量。线程池,用来执行当前的排序任务。排序任务。将排序中涉及的到操作,封装到一个任务中。包括从文件中读取数据到内存,再将内存中的内容进行排序,最后再将排序后的

2021-02-17 09:46:41 312

原创 在单台机器上实现TB级的数据对比之数据切分

在单台机器上实现TB级的数据对比之数据切分文件切分的逻辑由于面对的原始文件可能是一堆小文件,也可能是一个很大文件,这第一步当然是对文件进行切割规整,统一大小为32M,这个32M是一个近似值,由于要保留完整的行,故这是一个接近值。那如何实现呢?分为两部分来说吧,第一部分是文件读取:读取目录下的文件,获得一个文件列表。列表使用数组来存储。将列表按文件名进行排序,获得数据读取文件的一个顺序,也就是数据的一个顺序。声明一个索引编号,编号从0开始,这个索引编号代表的就是当前正在读取的文件。按索引编号

2021-02-17 09:42:46 183

原创 在单台机器上实现TB级的数据对比

在单台机器上实现TB级的数据对比前几天我在做公司项目的时候,需要对数据进行比较。数据量不大,也就几千条而已。当时功能完成后,我开始思考一个问题。就是当对比的文件是特别大的时候,我还能实现吗?那现在对问题做出假设:问题:现在有两个超大文件集,原始数据集和目标数据集,每个文件集中都有超过1亿的记录,数据中存在重复的记录,编写一个程序,可以找出两个数据集之间的差异,求解出三类数据:原始数据集中存在,目标数据集中不存在,为待删除的数据记录。原始数据集中存在,目标数据集中也存在,但内容不一致,为待修改的记录

2021-02-07 15:52:39 219

原创 跳表加散列表实现有序的散列表(MySkipListHashMap)

跳表加散列表实现有序的散列表(MySkipListHashMap)介绍有序的,还是散列表,是不是听起来就觉得这不太现实啊!但现实往往就是这么打脸,听起来不可思议的东西,却是可以做到的。散列表,一个无序的数据结构。通过散列函数将数据散列分布到各个数据的槽里。那如何保证数据的有序呢?在java的库中有一个是实现的有序的数据结构LinkedHashMap,按照插入顺序来保存的有序,这个数据结构是通过散列表与双向链表的结合,来实现的一个保存数据。受此启发。我来实现一个按照数据的顺序来保存的有序数结构。操作:

2021-01-31 14:28:02 259

原创 手写LinkedHashMap

手写LinkedHashMap在上一篇博客,我实现一个MyHashMap,那今天继续来实现一个LinkedHashMap,LinkedHashMap相对于HashMap保存了数据插入的顺序,觉得神奇的,HashMap我们都知道,通过散列函数,将数据分散到不同的槽中,再从槽中去读取数据。这一过程听起来就是无法保证顺序的。那要如何保证插入的顺序呢?其实在LinkedHashMap中,加了下一个双向链表。 /** * HashMap.Node subclass for normal Link

2021-01-23 15:43:59 176

原创 跳表加散列表实现HashMap

自己实现HashMap在平时的开发中,jdk库中的HashMap是我们在平时的开发中用的非常多的容器之一,我常常在想,自己能否也实现一个呢?以前觉得非常的复杂,但当我学习了跳表,和散列表后,我觉得这个问题我可以尝试了,于是就开始了自己实现MyHashMap之旅。1. 需求定义既然要实现一个HashMap,那还是先需求吧。public class MyHashMap<K, V> { public MyHashMap(int capacity){} public void put(

2021-01-16 11:39:13 278

原创 快速排序

快速排序的基本思想快速排序也是利用分治的思想。如果需要排序的数据的下标是从s到t,在下标s到t之间的任意一个数据作为分区点p,遍历s到t之间的数据,将小于分区点的数据放到分区点p的左边,将大于分区点的数据放到分区点的右边,分区点放在中间,经过这一操作后。数据被分为3个部分,s到p-1之间为小于分区点的数据,p+1到t之间为大于分区点的数据,p为分区点。根据分治递归的处理思想,可以递归排序s到p-1的区间和p+1到t的区间,直到区间缩小为1,说明排序完成,所有数据都已经为有序。文字还是没有图直观:分区点

2021-01-08 18:08:26 227

原创 跳表

跳表针对链表这种数据数据结构,捎加改造,可以支持类似“二分”的查找算法,这就是跳表。如何理解跳表对于单链表来说,即使存储的数据是有序的,如果在链表中查找某个数据,也只能从头到尾依次遍历,时间复杂度会很高,是O(n)。对于单链表如何提高查找效率呢?可以类似图中如下做一级“索引”,这样子查询起来就会快很多,每两个节点抽取一个结点到上一级,可以把抽取出来的叫作索引。图中down表示down指针,指向下一级。以查找6为例,首先可以遍历一级索引,当遍历到节点为5时,索引的下一个节点为7,大于需查找到6,

2021-01-01 22:40:25 174

原创 重构实例-消息发送-使用策略进行重构-枚举方式-7

7. 重构实例-消息发送-使用策略进行重构-枚举方式由于这是一个长文,分成了好几章来介绍如何重构。原始代码及准备职责独立去除static关键字接口添加转换方法方法合并使用策略进行重构-Map方式使用策略进行重构-枚举方式经过上一次的重构我想你基本理解了使用map的策略模式,我们再来看使用策略模式的另一种实现list7.1 重构步骤这个还是规矩检查单元测试。使用枚举将类型与实例相绑定。进行策略的实现。执行单元测试。7.2 检查单元测试这个单元测试没有变化,可跳过7.

2021-01-01 22:39:59 123

空空如也

空空如也

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

TA关注的人

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