最近做一个新需求,用户发布了动态,前台需要查询,为了用户读取信息响应速度更快(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. 20172305 2018-2019-1 《Java软件结构与数据结构》第五周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 本周内容主要为书第九章内容: 查找是在某个项目组中寻找到某一指定目标元素,或者确定 ...

  2. SpringMVC整个执行流程

    在SSM (或SSH) 框架整合使用后,基本骨架看上去还是MVC的结构. MyBatis整合一些数据封装方法节省了DAO层的代码量, Spring提供了AOP,IoC( DI 具体实现 ). 而Spr ...

  3. 嵌入式Linux应用程序开发环境搭建记录

    2016年2月 参考资料: OK210软件手册(Linux版).pdf Ubuntu下Qt4.7.1编译环境配置说明.pdf 我阅读了以下内容: OK210软件手册(Linux版).pdf 第七章 O ...

  4. Codeforces Round #390 (Div. 2) D. Fedor and coupons(区间最大交集+优先队列)

    http://codeforces.com/contest/754/problem/D 题意: 给定几组区间,找k组区间,使得它们的公共交集最大. 思路: 在k组区间中,它们的公共交集=k组区间中右端 ...

  5. install diagnostic_updater

    sudo apt-get install ros-kinetic-diagnostic-updater

  6. PHP获得真实客户端的真实时用到的IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

    REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP.如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP. HTTP_CLIENT_IP 是代理服务器发送的HTTP头. ...

  7. Win32 基本文件读写操作

    https://www.cnblogs.com/Clingingboy/archive/2011/05/10/2042645.html

  8. 前端工程构建工具——Yeoman

    一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescrip ...

  9. MySQL使用和操作总结(《MySQL必知必会》读书笔记)

    简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机——服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...

  10. js 数据函数

    //shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4,5]  ...