消息队列RabbitMQ_03_交换机、死信队列、延迟队列+整合Springboot
在上一节中,我们创建了一个工作队列。我们假设的是工作队列背后,每个任务都恰好交付给一个消费者(工作进程)。在这一部分中,我们将做一些完全不同的事情-我们将消息传达给多个消费者。这种模式 称为 ”发布/订阅”。 为了说明这种模式,我们将构建一个简单的日志系统。它将由两个程序组成:第一个程序将发出日志消息,第二个程序是消费者。其中我们会启动两个消费者,其中一个消费者接收到消息后把日志存储在磁盘,另外一个消费者接收到消息后把消息打印在屏幕上,事实上第一个程序发出的日志消息将广播给所有消费者 三、Exchanges交换机 RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反,生产者只能将消息发送到交换机(exchange),交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。交换机必须确切知道如何处理收到的消息。是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。 RabbitMQ-00000035 Exchan ...
消息队列RabbitMQ_02_简单案例、工作队列、消息确认、发布确认模式(三种确认发布方式)
一、Hello world 我们将用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者 在下图中,“ P” 是我们的生产者,“ C” 是我们的消费者。中间的框是一个队列 RabbitMQ 代表使用者保留的消息缓冲区 RabbitMQ-00000012 连接的时候,需要开启 5672 端口 image-20210626162052259 依赖 pom.xml 123456789101112131415161718192021222324252627<!--指定 jdk 编译版本--><build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> ...
消息队列RabbitMQ_01_介绍、软件安装
MQ 的相关概念 几种工作模式简单总结:https://blog.csdn.net/weixin_44792186/article/details/122933442 RabbitMQ的四大核心: 生产者、交换机、队列、消费者 RabbitMQ的六大工作模式: 简单模式、工作队列模式、发布确认模式、发布订阅模式、路由模式、主题模式 什么是MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常 见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不 用依赖其他服务。 为什么要用MQ 流量消峰 举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间 ...
瑞吉外卖-项目总结
一、概述 功能架构图 数据库建库建表 表说明 ## 开发环境 ### Maven搭建 直接创建新工程 继承父工程的形式来做这个,这里新建父工程 pom文件 123456789101112131415161718192021222324252627282930server: port: 9001spring: application: name: ccTakeOut datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ruiji?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: root p ...
Ajax快速入门(Ajax简介、原生Ajax、三种【jQuery\Axios\Fetch】常见发送Ajax请求、跨域与解决)
说明 本笔记为尚硅谷Web前端Ajax教程初学者零基础入门到精通全套完整版的学习笔记 该课程主要讲述原生AJAX的写法 以及 市场上常用的对于原生ajax封装的插件简单使用 地址:https://gitee.com/hongjilin/hongs-study-notes/blob/master/ 目录 [TOC] 一、Ajax简介 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。 AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。 1、XML简介 XML 可扩展标记语言。 XML 被设计用来传输和存储数据。 XML 和 HTML 类似,不同的是 HTML 中都是预定义标签,而 XML 中没有预定义标签, 全都是自定义标签,用来表示一些数据。 比如说我有一个学生数据: name = "孙悟空" ; age = 18 ; gender = "男" ; 123456用 XML 表示:<stud ...
JUC-05--共享模型之工具【线程池、JUC并发编程、读写锁、Semaphore信号量、CountdownLatch倒计时锁、CyclicBarrier循环栅栏、CurrentHashMap】
8.共享模型之工具 8.1 线程池 8.1.1 自定义线程池 步骤1:自定义拒绝策略接口 1234@FunctionalInterface //拒绝策略interface RejectPolicy<T>{ void reject(BlockingQueue<T> queue,T task);} 步骤2:自定义任务队列 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127class BlockingQueue<T>{ //阻 ...
JUC-04--共享模型之无锁、不可变【CAS、原子并发典型实现、ABA问题、日期转换问题、不可变设计】
6.共享模型之无锁 6.1 问题提出 (应用之互斥) 有如下需求,保证 account.withdraw 取款方法的线程安全 123456789101112131415161718192021222324252627282930313233package cn.itcast;import java.util.ArrayList;import java.util.List;interface Account { // 获取余额 Integer getBalance(); // 取款 void withdraw(Integer amount); /** * 方法内会启动 1000 个线程,每个线程做 -10 元 的操作 * 如果初始余额为 10000 那么正确的结果应当是 0 */ static void demo(Account account) { List<Thread> ts = new ArrayList<>(); long start = System.nanoTime( ...
JUC-03--共享模型之内存【java内存模型、可见性、有序性】
5. 共享模型之内存 上一章讲解的 Monitor 主要关注的是访问共享变量时,保证临界区代码的原子性。这一章我们进一步深入学习共享变量在多线程间的【可见性】问题与多条指令执行时的【有序性】问题 5.1 Java 内存模型 JMM 即 Java Memory Model,它从java层面定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面 原子性 - 保证指令不会受到线程上下文切换的影响 可见性 - 保证指令不会受 cpu 缓存的影响 有序性 - 保证指令不会受 cpu 指令并行优化的影响 5.2 可见性 退不出的循环 先来看一个现象,main 线程对 run 变量的修改对于 t 线程不可见,导致了 t 线程无法停止:Test1.java 123456789101112131415public class Test1 { static boolean run = true; public static void main(String[] args) throws InterruptedExc ...
JUC-02--共享模型之管程【synchronized、变量线程安全分析、Monitior概念、wait和notify、park和unpark、✨Java状态转换、ReentrantLock】
共享模型之管程 目录: 1、共享问题 2、synchronized 3、线程安全分析 4、Monitor 5、wait/notify 6、线程状态转换 7、活跃性 8、Lock 4.1 线程出现问题的根本原因分析 线程出现问题的根本原因是因为线程上下文切换,导致线程里的指令没有执行完就切换执行其它线程了,下面举一个例子 两个线程对初始值为0的静态变量一个做自增,一个做自减,各做5000次,结果是0吗? 123456789101112131415161718static int count = 0;public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(()->{ for (int i = 1;i<5000;i++){ count++; } }); Thread t2 =new Thread(()->{ ...
JUC-01--进程与线程、Java线程【线程创建、API、状态】
前言:文中出现的示例代码地址为:gitee代码地址 二、线程与进程 2.1 进程与线程 进程 程序由指令和数据组成,但是这些指令要运行,数据要读写,就必须将指令加载到cpu,数据加载至内存。在指令运行过程中还需要用到磁盘,网络等设备,进程就是用来加载指令管理内存管理IO的 当一个指令被运行,从磁盘加载这个程序的代码到内存,这时候就开启了一个进程 进程就可以视为程序的一个实例,大部分程序都可以运行多个实例进程(例如记事本,浏览器等),部分只可以运行一个实例进程(例如360安全卫士) 线程 一个进程之内可以分为一到多个线程。 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行 Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。 在 windows 中进程是不活动的,只是作为线程的容器(这里感觉要学了计算机组成原理之后会更有感觉吧!) 二者对比 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集 进程拥有共享的资源,如内存空间等,供其内部的线程共享 进程间通信较为复杂 同一台计算机的进程通信称为 IPC(Inter-process co ...