学习笔记
文章平均质量分 75
null_null_bug
这个作者很懒,什么都没留下…
展开
-
RabbitMQ消息可靠性保证机制3--消费端ACK机制
可以保证数据成功的发送到RabbitMQ,以及持久化机制,然尔这依然无法完全保证整个过程的可靠性,因为如果消息被消费过程中业务处理失败了,但是消息却已经被标记为消费了,如果又没有任何重度机制,那结果基本等于丢消息。由于消息被不断的重新放回队列,而消费者又只有当前这一个,所以,在不断拒收中被放回。从观察到的结果也印证了,反复的被推送,接收的一个过程中,使用命令查看队列的一个消费的情况。通过观察发现,消息已经没有在队列中了,那就是消息已经被丢弃了。在浏览器中访问,同样有66%的概率会被拒绝,仅33%会被确认。原创 2024-01-07 21:28:32 · 1427 阅读 · 0 评论 -
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 · 658 阅读 · 0 评论 -
RabbitMQ-常用命令
rabbitmq-常用命令使用原创 2023-08-26 16:13:08 · 4969 阅读 · 0 评论 -
RabbitMQ消息可靠性保证机制--发送端确认
RabbitMQ后来引入了一种轻量级的方式,叫发送方确认(publisher confirm)机制,生产者将信息设置成confirm(确认)模式,一旦信道进入了confirm模式,所有在该信道上面发送的消息都会被指派成一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后(如果消息和队列是持久化的,那么消息会在消息持久化后发出),RabbitMQ就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一的ID),这样生产者就知道消息已经正确送达了。原创 2023-09-24 19:52:38 · 327 阅读 · 0 评论 -
SpringBoot整合RabbitMQ
引入SpringBoot的父类</</</</maven的导入</</</</</</</</</</</</</</原创 2023-09-21 20:07:57 · 272 阅读 · 0 评论 -
Spring整合RabbitMQ-注解方式
maven导入</</</</提示:ConnectionFactory有三个实现CachingConnectionFactory 基于channel的缓存模式 最常用是这个。LocalizedQueueConnectionFactory 直接连接某个节点的方式。如果是集群,此种不太适合。SimpleRoutingConnectionFactory 在当前的连接工厂中按查找的KEY获取连接工厂。运行消息的生产者,查看消息发送信息通过检查发现,消息已经成功的发送到了队列运行主程序,检查控制台的输出。原创 2023-09-12 22:09:27 · 733 阅读 · 0 评论 -
Spring整合RabbitMQ-配制文件方式-3-消息拉模式
当启动消费者后,便可获取到发送至队列的消息。经过检查确认,发现消息已经被消费了。至此拉模式的消费者完成。原创 2023-09-05 21:51:28 · 490 阅读 · 0 评论 -
Spring整合RabbitMQ-配制文件方式-2-推模式消费者
除消息外,还提供了Channel这个对象,通过channel可以有更大的灵活性。再观察消息者,便能看到消费者队列中已经收到了发送的消息。这样监听者就会处于监听状态。普通的场景基本够用。在推模式中消息的即时性比拉模式会好。再启动生产者,向队列中发送消息。原创 2023-09-05 21:49:28 · 585 阅读 · 0 评论 -
Spring整合RabbitMQ-配制文件方式-1-消息生产者
Spring-amqp是对AMQP的一些概念的一些抽象,Spring-rabbit是对RabbitMQ操作的封装实现。主要有几个核心类等类完成对Exchange、Queue、Binding的操作,在容器中管理 了类的时候,可以对Exchange、Queue、Binding进行自动声明。类是发送和接收消息的工具类。是消费消息的容器。目前一些比较新的项目会使用基于注解的方式,而比较老的一些项目可能还是基于配制文件的方式。原创 2023-09-05 21:46:05 · 633 阅读 · 0 评论 -
RabbitMQ工作模式-主题模式
top类型的交换器背后原理跟direct类型类似只要队列的bingingkey的值与消息的routingKey的匹配,队列就可以收到该消息。使用topic类型的交换器,队列绑定到交换器、bingingKey时使用通配符,交换器将消息路由转发到具体队列时,会根据消息routingKey模糊匹配,比较灵活。使用topic类型的交换器, routingKey就不能随便写了,它必须是点分单词,单词可以随便写,一般按消息的特征,该点分单词字符串最长255字节。观察可以发现,此队列与消息的绑定已经成功。原创 2023-08-30 21:57:54 · 469 阅读 · 0 评论 -
RabbitMQ工作模式-路由模式
官方文档参考:https://www.rabbitmq.com/tutorials/tutorial-four-python.html。即按日志不同的级别,分发到不同的队列。每个队列只处理自己的对应的级别日志。类型的Exchange,发N条消息并使用不同的routingKey,消费者定义队列并将队列。完成匹配的情况下消息才会转发到对应的队列中被消费。启动消费者,查看消息通否被正常消费。ERROR的消费者控制台输出。创建WARN级别的消息者。创建ERROR的消费者。创建INFO级的消费者。原创 2023-08-30 21:55:29 · 1115 阅读 · 0 评论 -
RabbitMQ工作模式-发布订阅模式
应该是追加到一个指定的队列,还是追加到多个队列,还是丢弃。每个消费者定义生成一个队列关绑定到同一个Exchange,每个消费者都可以消费完整的消息。在RabbitMQ中,生产者不是将消息直接发送给消息消息队列,实际上生产者根本不知道一个消息被发送到哪个队列。当启动生产者后,可以发现已经产生了3个默认的交换机及队列的绑定关系。交换器很简单,从名称就可以看出来(用风扇吹出去),将所有的收到的消息发给它的知道的所有队列。此样例使用的是临时队列,即消费都实现将自动创建此队列,当消费都退出后,此队列也将自动删除。原创 2023-08-30 21:51:56 · 579 阅读 · 0 评论 -
RabbitMQ工作模式-工作队列
官网关于工作模式的解释地址:https://www.rabbitmq.com/getstarted.html。原创 2023-08-30 21:37:09 · 913 阅读 · 0 评论 -
解决因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 · 2739 阅读 · 0 评论 -
使用redis进行分布式加锁实现
1 redis分布式加锁现在业务并发量越来越大,像传统的数据库操作,已经不能满足要求了,这个时候可以使用redis来提升性能,同时也可以使用redis实现分布式锁。使用redis实现分布式锁,与java的synchronize类似,只不过是synchronize锁单对象,而分布式锁是锁进程或者线程,同样的它是一个独占锁,一旦被某个线程拿到锁,其他的线程或者进程,只能进行等待后再获取。当线程或者进程使用完毕释放锁后,其他线程才能获取到锁。下面将基于redis实现一个分布式锁。代码实现先看Redis的原创 2021-05-30 13:01:51 · 471 阅读 · 0 评论 -
java实现异步非阻塞的几种方式-消息中间件
java实现异步非阻塞的几种方式-消息中间件4. 消息中间件在前面已经实现了异步调用、接口回调两种形式,都较为复杂,需要自己控制多线程,那有没有简单点的方式来实现异步的消息通讯。这个当然是有的,可以使用消息中间件的形式,来实现整个消息的异步调用。还是以订单这个场景为示例来举个粟子。4.1 样例代码我的样例程序使用rabbitmq来做为消息队列传输数据,其他消息队列功能类似。先从订单服务开始。@RestController@RequestMapping("/order")public cla原创 2021-03-23 22:17:03 · 611 阅读 · 0 评论 -
java中5种实现单例模式的方法
单例模式的多种实现方式1. 为什么会需要单例:1. 节省内存,单例对象可避免频繁的创建与销毁,带来性能的提升。2. 对象的共享,例如配制。2. 实现单例的方式饿汉式懒汉式双重检测静态内部类枚举2.1 单例-饿汉式public class UniqueIdGenerator { private static final UniqueIdGenerator INSTANCE = new UniqueIdGenerator(); /** 私有化构建函数 */ priva原创 2020-12-12 17:11:48 · 121 阅读 · 1 评论 -
java实现异步非阻塞的几种方式-接口回调
java实现异步非阻塞的几种方式-33. 接口回调在异步阻塞的调用过程中线程还是会存在于阻塞中。等待响应的结果,那能不能在发起请求后就不再关心这个逻辑,而执行其他的任务呢?那就要用到callback机制。还是以订单查询为示例。先来说下整个的调用链吧。当这个异步回调机制加入之后,原来order的等待的结果的响应就不存在,可以做其他的事情去了,等着其他用户和商品服务完成之后,调用即可。3.1 样例代码订单服务的代码:@RestController@RequestMapping("/order"原创 2021-03-14 22:45:28 · 947 阅读 · 0 评论 -
java实现异步非阻塞的几种方式-异步调用
java实现异步非阻塞的几种方式-2异步调用,就相关于将原来同步调用的代码块放置到一个又一个的线程中去执行,这样就可以并行的执行相关的任务。也就不用卡在一个点的等待,进而影响后续的任务。还以是订单为示例,演示整个调用的过程。2. 异步调用2.1 样例代码首先加入的就是线程池public class ScheduleTaskThreadPool { /** 进行任务调度的线程池对象 */ public static final ScheduleTaskThreadPool INSTANCE原创 2021-03-14 22:42:55 · 1702 阅读 · 0 评论 -
java实现异步非阻塞的几种方式-同步阻塞调用
java实现异步非阻塞的几种方式-11. 同步阻塞调用在讲异步非阻塞之前还是先来说明同步阻塞的调用吧。明白了同步阻塞的调用,才能更好的明白异步非阻塞的调用。以一个示例来说明吧,这是一个非常常见的程序间的调用。我们的程序对外提供当前的用户的订单详细查询的接口,订单接口先调用用户服务,获取当前的用户信息;再调用商品接口获取商品的详细信息。就以这样一个示例程序来说明吧。假设这个订单服务调用用户服务的时间是2秒,调用商品服务的时间是3秒,订单服务自身的处理时间是1秒,那整个处理流程所需的时间就是2+3+原创 2021-03-14 22:38:49 · 554 阅读 · 0 评论 -
性能测试工具-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 · 1269 阅读 · 0 评论 -
java调用shell脚本和命令-ProcessBuilder方式
java调用shell脚本和命令-ProcessBuilder方式在上一节中,我使用Runtime的方式,实现了对命令行和脚本文件的运行。最后我留下了一个小小的问题那就是这个InputStream和errorStream需要分开获取,那有没有其他方,不用分开获取流呢?1.相关文档答案当然是有的,这就是这章节要使用的ProcessBuilder方式了。同样的,也先看下ProcessBuilder的API吧。类用于创建操作系统进程。每个 ProcessBuilder 实例管理一个进程属性集。sta原创 2021-02-28 22:53:39 · 5000 阅读 · 6 评论 -
Java调用Shell命令和脚本-Runtime方式
java运行shell脚本和命令-Runtime方式使用java调用命令行在项目的开发中经常会使用到,在我最近的一个项目中,也使用到了java调用命令和shell脚本。我将用这篇文章记录下来java调用命令行的实现。这个是java中使用最多的一种方案吧,对于Runtime在JAVA的API中是这样解释的:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。应用程序不能创建自己的 Runtime 类实例。原创 2021-02-27 16:42:26 · 1561 阅读 · 6 评论 -
跳表
跳表针对链表这种数据数据结构,捎加改造,可以支持类似“二分”的查找算法,这就是跳表。如何理解跳表对于单链表来说,即使存储的数据是有序的,如果在链表中查找某个数据,也只能从头到尾依次遍历,时间复杂度会很高,是O(n)。对于单链表如何提高查找效率呢?可以类似图中如下做一级“索引”,这样子查询起来就会快很多,每两个节点抽取一个结点到上一级,可以把抽取出来的叫作索引。图中down表示down指针,指向下一级。以查找6为例,首先可以遍历一级索引,当遍历到节点为5时,索引的下一个节点为7,大于需查找到6,原创 2021-01-01 22:40:25 · 190 阅读 · 0 评论 -
java如何避免传递null-空对象模式
java如何避免传递null-空对象模式示例代码:public class CustomerFactory { private static final String[] DATA = {"1", "2", "3"}; public RealDataQuery query(String query) { for (String dataId : DATA) { if (dataId.equals(query)) { return new RealDat原创 2020-12-05 17:51:10 · 1226 阅读 · 0 评论 -
学习笔记-数据结构与算法-归并排序
归并排序核心思想:将一个数组一分二,然后将两个数组分别排序,最后将两个有序数据合并,就完成了归并排序。归并排序使用的是分治思想,分而治之,将一个大问题分解为n个小问题,小问题解决了,大问题也就解决了。归并排序一般使用递归来实现,要写出递归代码的关键,写出递推公式,找到终止条件。归并排序的递推公式:merge_sort(p…r) = merge(merge_sort(p…q)...原创 2019-11-24 19:45:12 · 221 阅读 · 0 评论