最近做一个新需求,用户发布了动态,前台需要查询,为了用户读取信息响应速度更快(MySQL很难实现或者说实现起来很慢),所以在用户动态发布成功后,利用消息机制异步构建 redis缓存 和 elasticsearch索引 。

开发环境

rabbitMQ服务端,docker安装

拉取rabbit-mq镜像
docker pull hub.c..com/library/rabbitmq:3.6.-management 运行镜像
docker run -d --name rabbitmq --publish : --publish : --publish : --publish : --publish : --publish : hub.c..com/library/rabbitmq:3.6.-management 后台地址:
http://192.168.1.8:15672

消息生产端(PHP):

composer 安装 rabbitmq客户端
composer require php-amqplib/php-amqplib 生产广播消息官方demo
https://github.com/php-amqplib/php-amqplib/blob/master/demo/amqp_publisher_fanout.php

应用中代码

<?php
/**
* User: szliugx@gmail.com
* Date: 2018/6/18
* Time: 下午1:54
*/ namespace App\ThirdParty\Message; use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage; class AmqpPublisher
{
public function send($content)
{
$exchange = 'message.fanout.exchange';
// 创建连接
$connection = new AMQPStreamConnection(
config('app.mq_host'),
config('app.mq_port'),
config('app.mq_user'),
config('app.mq_pass'),
config('app.mq_vhost')
);
$channel = $connection->channel();
/*
name: $exchange
type: fanout
passive: false // don't check is an exchange with the same name exists
durable: false // the exchange won't survive server restarts
auto_delete: true //the exchange will be deleted once the channel is closed.
*/
$channel->exchange_declare($exchange, 'fanout', false, true, false);
$messageBody = $content;
$message = new AMQPMessage($messageBody, array('content_type' => 'text/plain'));
$channel->basic_publish($message, $exchange);
// 关闭通道
$channel->close();
// 关闭连接
$connection->close();
}
}

消息消费端(Java):

引入maven依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

配置广播队列信息

package cn.taxiong.release.config;

import cn.taxiong.release.constant.QueueConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* RabbitMQFanout模式配置
*
* @author szliugx@gmail.com
* @create 2018-06-18 下午4:04
**/
@Slf4j
@Configuration
public class RabbitMQFanoutConfig { @Bean
public Queue createFanoutQueueCache() {
log.info( "创建了FanoutQueue cache 缓存 队列" );
return new Queue(QueueConstants.MESSAGE_QUEUE_RELEASE_CACHE_NAME);
} @Bean
public Queue createFanoutQueueIndex() {
log.info( "创建了FanoutQueue index 缓存 队列" );
return new Queue(QueueConstants.MESSAGE_QUEUE_RELEASE_INDEX_NAME);
} @Bean
public FanoutExchange fanoutExchangeRelease() {
log.info( "创建了fanoutExchange交换机" );
return new FanoutExchange( QueueConstants.MESSAGE_FANOUT_EXCHANGE);
} @Bean
public Binding fanoutExchangeCacheQueueBinding() {
log.info( "将FanoutQueue cache 队列绑定到交换机fanoutExchange" );
return BindingBuilder.bind( createFanoutQueueCache() ).to( fanoutExchangeRelease() );
} @Bean
public Binding fanoutExchangeIndexQueueBinding() {
log.info( "将FanoutQueue index 队列绑定到交换机fanoutExchange" );
return BindingBuilder.bind( createFanoutQueueIndex() ).to( fanoutExchangeRelease() );
}
}

队列常量信息

package cn.taxiong.release.constant;

/**
* 队列常量
*
* @author szliugx@gmail.com
* @create 2018-06-14 下午7:02
**/
public interface QueueConstants {/**
* 消息交换
*/
String MESSAGE_FANOUT_EXCHANGE = "message.fanout.exchange"; /**
* 发布缓存消息队列名称
*/
String MESSAGE_QUEUE_RELEASE_CACHE_NAME = "message.release.cache.queue"; /**
* 发布索引消息队列名称
*/
String MESSAGE_QUEUE_RELEASE_INDEX_NAME = "message.release.index.queue";
}

缓存(cache)服务消费消息:

package cn.taxiong.release.message;

import cn.taxiong.release.constant.QueueConstants;
import cn.taxiong.release.service.OperateReleaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component; /**
* 消息消费
*
* @author szliugx@gmail.com
* @create 2018-06-14 下午7:14
**/
@Slf4j
@Component
@RabbitListener(queues = QueueConstants.MESSAGE_QUEUE_RELEASE_CACHE_NAME)
public class MessageConsumer { @Autowired
private OperateReleaseService operateReleaseService; @RabbitHandler
public void handler(@Payload String message) {
// operateReleaseService.storeReleaseRedisCache(message);
log.info("缓存cache消息消费1:{}", message);
}
}

索引(index)服务消费消息:

package cn.taxiong.release.message;

import cn.taxiong.release.constant.QueueConstants;
import cn.taxiong.release.service.OperateReleaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component; /**
* 消息消费
*
* @author szliugx@gmail.com
* @create 2018-06-14 下午7:14
**/
@Slf4j
@Component
@RabbitListener(queues = QueueConstants.MESSAGE_QUEUE_RELEASE_INDEX_NAME)
public class MessageConsumer2 { @Autowired
private OperateReleaseService operateReleaseService; @RabbitHandler
public void handler(@Payload String message) {
log.info("索引消息 index 消费2:{}", message);
}
}

rabbitMQ应用,laravel生产广播消息,springboot消费消息的更多相关文章

  1. kafka生产者与消费者的生产消息与消费消息所遇到的问题

    当我们用API写kafka的时候 生产者生产消息,但是消费者接收不到消息?集群上启动消费者显示生产的消息.我们需要修改一下配置 (1)我们打开在虚拟机中修改kafka集群的配置文件 [root@spa ...

  2. RabbitMQ 消费消息

    1, 创建一个 springboot 项目, 导入依赖(和生产者一致) 2, application.properties (基础配置和生产者一致, 消费者需要再额外配置一些) # rabbitmq ...

  3. 压测应用服务对RabbitMQ消息的消费能力--实践脚本

    最近运维跟我反馈我负责的应用服务线上监控到消费RabbitMQ消息队列过慢,目前只有20左右,监控平台会有消息积压的告警. 开发修改了一版应用服务的版本,提交给我做压测验证. 之前没有做过消息中间件的 ...

  4. 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...

  5. 综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    来源:http://t.cn/RVDWcfe 一.资料文档 Kafka:中.有kafka作者自己写的书,网上资料也有一些.rabbitmq:多.有一些不错的书,网上资料多.zeromq:少.没有专门写 ...

  6. 【Azure Developer】在Azure VM (Windows) 中搭建 kafka服务,并且通过本地以及远程验证 发送+消费 消息

    问题描述 查看了 "How to Install and Run Apache Kafka on Windows? " 一文后,成功安装了Kafka服务,但是如何使用呢?如何在其他 ...

  7. RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

    目录 消息存储 消息存储方式 非持久化 持久化 消息存储介质 消息存储与读写方式 消息存储结构 刷盘机制 同步刷盘 异步刷盘 小结 高可用 高可用实现 主从复制 负载均衡 消息重试 顺序消息重试 无序 ...

  8. 2.RABBITMQ 入门 - WINDOWS - 生产和消费消息 一个完整案例

    关于安装和配置,见上一篇 1.RABBITMQ 入门 - WINDOWS - 获取,安装,配置 公司有需求,要求使用winform开发这个东西(消息中间件),另外还要求开发一个日志中间件,但是也是要求 ...

  9. springboot项目整合rabbitMq涉及消息的发送确认,消息的消费确认机制,延时队列的实现

    1.引入maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

随机推荐

  1. Python安装安装.whl包(安装pylint)

    Python安装安装.whl包(安装pylint) Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. 1,,下载.whl ...

  2. 对OpenCV中3种乘法操作的理解掌握

    参考了<Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 >“http://blog.csdn.net/dcrmg/article/details/52404580”的相关内容 ...

  3. Tensorflow代码解析(一)

    http://www.leiphone.com/news/201702/n0uj58iHaNpW9RJG.html?utm_source=tuicool&utm_medium=referral ...

  4. 第四章 consul cluster

    1.vagrant 为了模拟集群效果,使用vagrant. 1.1.首先下载vagrant https://www.vagrantup.com/downloads.html 说明:浏览器下载可能比较慢 ...

  5. 如何创建.babelrc文件?

    方法一: 根目录下,创建  .babelrc.  文件名就可以了! 方法二: git进入根目录,输入   type>.babelrc  ,回车即可!

  6. APP AutoTestCaseID

    public class AutoTestCaseID { ElementExist el = new ElementExist(); static AutoTestExcelFile ft = ne ...

  7. R语言笔记-set.seed()函数

    今天查了一下R语言中set.seed(),该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性.如果不设定种子,生成的随机数无法重现. set.seed()用于设定随机数种子,一个特定的种子 ...

  8. JavaScript获取输入框内容

    html: <input name="money" type="number" placeholder="税前工资"><b ...

  9. adb相关指令

    adb rootadb connect 172.16.20.162  //通过adb连接远程设备adb pull /data/data/com.xiaomi.voicecontrol /Users/r ...

  10. Hive之序列化与反序列化(SerDe)

    序列化与反序列化的作用 1,序列化是对象转化为字节序列的过程: 2,反序列化是字节码恢复为对象的过程: 序列化的作用主要有两个: (1),对象向的持久化:即把对象转换成字节码后保存文件: (2),对象 ...