RabbitMQ

SpringBoot+RabbitMQ学习笔记(一)

拈花ヽ惹草 提交于 2020-04-29 12:36:15
一丶添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 配置文件:application.properties server.port=8883 spring.application.name =hello- world spring.rabbitmq.host = localhost spring.rabbitmq.port =5672 spring.rabbitmq.username = guest spring.rabbitmq.password =guest

SpringBoot+RabbitMQ学习笔记(二)使用RabbitMQ的三种交换器之Direct

穿精又带淫゛_ 提交于 2020-04-29 12:35:58
一丶简介 Direct Exchange 处理路由键。需要将一个队列绑定到交换器上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换器上要求路由键 “test”,则只有被标记为“test”的消息才被转发,不会转发test.aaa,也不会转发dog.123,只会转发test。 业务场景,系统日志处理场景: 1.微服务产生日志,交给日志服务器处理。 2.日志服务器一共有4个服务,分别问DEBUG、INFO、WARN、ERROR(这里只写两个INFO和ERROR)。 3.服务之间的通信采用Direct(发布订阅)。 二 丶配置文件 我分别创建了两个项目,一个作为生产者来发送日志,一个作为消费者来接收日志。 生产者配置: 1 server.port=8883 2 3 spring.application.name=hello- world 4 5 spring.rabbitmq.host= localhost 6 spring.rabbitmq.port=5672 7 spring.rabbitmq.username= guest 8 spring.rabbitmq.password= guest 9 10 #设置交换器名称 11 mq.config.exchange= log.direct 12 #info的路由键 13 mq.config.queue

分布式-技术专区-Redis和MySQL缓存一致性问题

点点圈 提交于 2020-04-29 12:12:19
1.Redis 缓存和 MySQL 数据如何实现一致性 需求起因 缓存和数据库一致性解决方案   在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。   读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。   不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。   举一个例子: 1.如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。 2.如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况 。   因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。   如来解决?这里给出两个解决方案,先易后难,结合业务和技术代价选择使用。 缓存和数据库一致性解决方案 1.第一种方案:采用延时双删策略   在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。 伪代码如下 public void write( String key, Object data){ redis

SpringBoot+RabbitMQ学习笔记(三)使用RabbitMQ的三种交换器之Topic

六月ゝ 毕业季﹏ 提交于 2020-04-29 09:33:48
一丶简介 Topic Exchange 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。 业务场景: 1.日志服务器记录用户服务、商品服务、订单服务三个服务。 2.日志服务器有三个日志服务:INFO日志处理服务、ERROR日志处理服务、全日志处理服务。 3.使用Topic交换器处理日志,匹配规则依次为:*.log.info、*.log.error和*.log.*。 二丶配置文件 还是创建两个项目,一个作为生产者一个作为消费者。 生产者配置: server.port=8883 spring.application.name =hello- world spring.rabbitmq.host = localhost spring.rabbitmq.port =5672 spring.rabbitmq.username = guest spring.rabbitmq.password = guest spring.thymeleaf.cache = false 设置交换器名称 mq.config.exchange =log.topic View Code 消费者配置: server

RabbitMQ 的使用

守給你的承諾、 提交于 2020-04-28 21:56:17
1. RabbitMQ安装 安装参考: https://www.rabbitmq.com/download.html a. 默认是C:/Program Files/....,这个目录中是存在空格符的,注意需要改变安装目录 b.RabbitMQ 与ERLANG 版本要保持一致 2.原理 RabbitMQ提供了6种消息模型 参考 https://www.rabbitmq.com/getstarted.html 2.1 基本消息模型 一对一只有一个消费者,起到一个缓冲作用。 2.2 工作队列 有多个消息者,但消费者消费消息的多少,完全取决于消费者的处理能力,能者多劳,相当于消费者主动从mq中取消息,而不是被mq安排消息,能消费者是公平的。 消费端消费数据时,会有一个确认消费完成的动作,mq收到消费完成的通知后,才会继续向该消费者发送消息 。 2.3 发布订阅模式 RabbitMQ 中有一个交换机Exchanges的概念,发布订阅就是通过交换机实现的。生产端先把消息发送到交换机,然后交换机再把消息发送到与其绑定的消息队列,这样就解决了生成端如何把一条消息批量发送到多个消息队列的问题。 2.4 routing 路由模式 路由模式较发布订阅模式,交换机直接向所有与之绑定的消息队列发送消息,而路由模式对交换机做了一些限制,它指定了一个route key,生产端向交换机发送消息时

人生苦短,Let's Go目录

↘锁芯ラ 提交于 2020-04-28 21:47:25
目录 GO语言系列(一)- 初识go语言 GO语言系列(二)- 基本数据类型和操作符 Go语言系列(三)- 基础函数和流程控制 GO语言系列(四)- 内置函数、闭包与高级数据类型 GO语言系列(五)- 结构体和接口 Go语言系列(六)- 接口和反射 Go语言系列(七)- 读写操作 Go语言系列(八)- Goroute和Channel Go语言系列(九)- Socket编程和Redis Go语言系列(十)- http编程和mysql Go语言系列(十一)之依赖管理 Go语言系列(十二)之RabbitMQ消息队列 Go语言系列(十三)之gin框架 Go语言系列(十四)之GORM学习指南 ... 更新中 Go语言知识点补充 01. Go语言中new和make的区别 02.Go语言中各种数据格式转换 03.Golang学习 - regexp 包 04.Go语言命名规范 Go 项目实战 Go语言实战-爬取校花网图片 Go语言实战爬虫项目 来源: oschina 链接: https://my.oschina.net/u/4323481/blog/3586961

SpringBoot学习之路---短博客搞懂消息队列是个啥(仅入门)

血红的双手。 提交于 2020-04-28 19:36:52
大家在学习过程可能经常会看到"消息队列"、“RabbitMQ”、"Kafka"等等这些词。反正我关注的挺多公众号会推送这些的相关文章,但是还没有到那种应用场景,所以就没有去额外关注。最近刚刚好学习了一些有关消息队列的知识,就来记录一下 消息队列是个啥 消息队列其实是一个消息的容器。它的底层是一个队列(Queue)的数据结构,它满足先进先出的原则。也就是说先进来的消息先出去,后进来后出去。这样消息被消费时,大致有个顺序可言。 基于消息队列的架构大致是这样的,浏览器发出某个请求,由 生产者 生成 消息 ,并进入到消息队列中,等待 消息接受者 来接受并处理。在等待的过程中,先把结果先返回给浏览器(比如注册账户时,先把消息放入消息队列中,然后把"注册成功"的消息返回给浏览器),而不是先处理它。在 消息接受者 接受消息后,编写相应的程序去处理它,最后如果有需要再把这个处理结果放到消息队列,等待别的 消息接受者 进行二次处理。 消息队列的各个概念解释 消息发送者(publisher) :也叫做消息生产者,是消息发送的源头 消息接受者(consumer) :接受消息并进行处理的程序,也叫做消息的消费者,它们在处理完消息 消息代理(message broker) :当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定 目的地 。 目的地(destination) :顾名思义

SpringCloud-Stream 消息驱动

亡梦爱人 提交于 2020-04-28 12:40:49
一、概述 是什么? Spring Cloud Stream 是一个构建消息微服务驱动的框架。可以屏蔽底层消息中间件的差异,降低版本切换成本,统一消息的编程模型,目前仅支持 RabbitMQ 和 Kafka。 设计思想 标准 MQ 的设计思想 生产者 / 消费者之间靠消息媒介传递信息内容,Message 消息必须走特定的通道,MessageChannel 消息通道里的消息如何被消费呢,谁负责收发处理?消息通道MessageChannel的子接口SubscribableChannel,由消息处理器MessageHandler所订阅 Spring Cloud Stream 的设计思想 如果我们的项目中用到了 RabbitMQ 和 Kafka 两种消息中间件,由于它们的架构不同,对实际开发造成了一定困扰;或者用到了一种消息中间件,随着后面的业务需求需要向另一种消息队列迁移,这无疑是灾难性的,会造成一大堆的改动,因为它们与系统耦合了,这时候 Spring Cloud Stream 就可以为我们提供一种解耦的方式。 Spring Cloud Stream 提供的解决方案是: 通过定义绑定器 Binder 作为中间层,实现了应用程序与消息中间件细节之间的隔离。 向应用程序暴露统一的 Channel 通道,使得应用程序不需要再考虑各种消息中间件的实现。 inputs 对应消费者,outputs

.Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统

放肆的年华 提交于 2020-04-28 05:54:12
一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈。 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理系统。相信大家对这两个肯定都已经很熟悉了,在开发过程中,这两个组件扮演了不可或缺的角色: 消息队列帮助我们进行 ”解耦“、”异步“、”削峰“ 定时任务帮助我们进行 "后台"、”监控"、“补偿" 定时任务调度系统大家都介绍过很多次了,园子里的很多文章我也都拜读过,我相信大家实际的工作中肯定也都在频繁的使用它。目前主流的组件有 Quartz和Hangfire两种,在两者的选择上来说建议大家熟悉哪个用哪个就可以,Hangfire是自带UI管理界面的,所以如果想直接接入系统并且不想再进行二次开发做UI,可以直接选择Hangfire。 因为我对于Quartz更熟悉,所以本系统的定时任务调度基于Quartz开发,消息队列基于RabbitMQ,同时有一套UI,用于可视化操作定时任务调度和管理消息队列配置。 本系统是开发自用的,原型是公司工作中使用的系统,私下里重写了一套后台代码,但是UI还是公司的那一套,因为是自用,所以无法达到直接开箱即用的效果,写这篇的目的只是希望分享两者的使用方式和场景,帮助各位在遇到相同应用场景的问题时能够有更多解决思路。 二.功能介绍 1.MQ界面化动态配置

Django的celery配置(包括定时任务、队列)

女生的网名这么多〃 提交于 2020-04-28 05:44:19
一、安装celery Django项目不需要安装celery这个包,可以直接使用django-celery这个包,,先来安装它,在终端中输入: pip install django-celery 二、安装rabbitmq,建立celery队列 我做的项目用的就是rabbitmq,按道理来说,也是可以用redis作为消息队列的,但是rabbitmq更好,此处不做详细解释,有兴趣的同学的可以去研究下。 ubuntu环境下,在终端中输入: sudo apt-get install rabbitmq-server 三、配置settings.py 首先要在INSTALLED_APPS中添加对djcelery的引用 INSTALLED_APPS = [ 'decelery', ] 再在settings.py中添加以下代码 import djcelery djcelery.setup_loader() BROKER_URL = 'amqp://guest:guest@localhost:5672/' CELERY_RESULT_BACKEND = 'amqp' CELERY_IMPORTS = ( "common.tasks.task1", "common.tasks.task2", ) 四、添加celery异步任务 在common/tasks/task1.py中添加以下代码