淘淘商城_day08_课堂笔记
今日大纲
- 问题,如何实现商品数据的同步?
- 学习MQ(消息队列)
- 搭建RabbitMQ的环境
- 学习RabbitMQ的队列
- 学习Spring-Rabbit
- 使用RabbitMQ完成商品数据的同步
如何实现商品数据同步
之前的数据同步的实现:
- 在前台系统开放接口
- 该接口中完成将Redis中的数据删除
- 后台系统在商品编辑、删除时调用该接口,即可实现商品数据的同步
该方案存在的问题: 系统间的耦合度太高了。
耦合度是指:其他团队的版本升级会影响到后端团队的版本升级。
商品的数据已经实现了和前台系统的同步,但是,搜索系统中索引数据没有和后台系统的数据同步,导致,后台系统的商品数据进行了更新,在搜索系统中搜索到的数据是旧的数据,也可以采用之前的方案解决,但是,因为系统间的耦合度太高了,所以不推荐使用该方案,所以需要使用MQ来解决该问题。
RabbitMQ
RabbitMQ的简介
开发语言:Erlang – 面向并发的编程语言。
AMQP
AMQP是消息队列的一个协议。
官网
MQ的其他产品
学习5种队列
安装文档
搭建RabbitMQ环境
具体参考《RabbitMQ-3.4.1安装手册.docx》
版本
推荐使用3.4.1版本。
安装
安装的注意事项
- 推荐使用默认的安装路径
- 系统用户名必须是英文
- Win8改名字非常麻烦,具体方法百度
- 计算机名必须是英文
- 系统的用户必须是管理员
如果安装失败的同学应该如何解决:
- 重装系统 -- 不推荐
- 将RabbitMQ安装到linux虚拟机中
- 推荐
- 使用别人安装好的RabbitMQ服务
- 只要给你开通一个账户即可。
- 使用公用的RabbitMQ服务,在192.168.50.22
- 推荐
错误:
安装完成后操作
1、系统服务中有RabbitMQ服务,停止、启动、重启
- 打开命令行工具
如果找不到命令行工具: - 启用管理插件
- 查看管理页面
- 通过默认账户 guest/guest 登录
如果能够登录,说明安装成功。添加taotao用户
管理界面中的功能
5种队列
导入itcast-rabbitmq
简单队列
图示
P:消息的生产者
C:消息的消费者
红色:队列
生产者将消息发送到队列,消费者从队列中获取消息。
导入RabbitMQ的客户端依赖
获取MQ的连接
生产者发送消息到队列
管理工具中查看消息
点击上面的队列名称,查询具体的队列中的信息:
消费者从队列中获取消息
Work模式
图示
一个生产者、2个消费者。
一个消息只能被一个消费者获取。
消费者1
public
class Recv {
private
final
static String QUEUE_NAME = "test_queue_work";
public
static
void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 同一时刻服务器只会发一条消息给消费者
//channel.basicQos(1);
// 定义队列的消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 监听队列,手动返回完成
channel.basicConsume(QUEUE_NAME, false, consumer);
// 获取消息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" [x] Received '" + message + "'");
//休眠
Thread.sleep(10);
// 返回确认状态
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}
消费者2
public
class Recv2 {
private
final
static String QUEUE_NAME = "test_queue_work";
public
static
void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 同一时刻服务器只会发一条消息给消费者
//channel.basicQos(1);
// 定义队列的消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 监听队列,手动返回完成状态
channel.basicConsume(QUEUE_NAME, false, consumer);
// 获取消息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" [x] Received '" + message + "'");
秒
Thread.sleep(1000);
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}
生产者
向队列中发送50条消息。
测试
测试结果:
- 消费者1和消费者2获取到的消息内容是不同的,同一个消息只能被一个消费者获取。
- 消费者1和消费者2获取到的消息的数量是相同的,一个是奇数一个是偶数。
其实,这样是不合理的,应该是消费者1要比消费者2获取到的消息多才对。
Work模式的"能者多劳"
测试:
消费者1比消费者2获取的消息更多。
消息的确认模式
消费者从队列中获取消息,服务端如何知道消息已经被消费呢?
模式1:自动确认
只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。
模式2:手动确认
消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。
手动模式:
自动模式:
订阅模式
图示
解读:
1、1个生产者,多个消费者
2、每一个消费者都有自己的一个队列
3、生产者没有将消息直接发送到队列,而是发送到了交换机
4、每个队列都要绑定到交换机
5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的
消息的生产者(看作是后台系统)
向交换机中发送消息。
注意:消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。
消费者1(看作是前台系统)
消费者2(看作是搜索系统)
测试
测试结果:
同一个消息被多个消费者获取。
在管理工具中查看队列和交换机的绑定关系:
使用订阅模式能否实现商品数据的同步?
答案:可以的。
后台系统就是消息的生产者。
前台系统和搜索系统是消息的消费者。
后台系统将消息发送到交换机中,前台系统和搜索系统都创建自己的队列,然后将队列绑定到交换机,即可实现。
消息,新增商品、修改商品、删除商品。
前台系统:修改商品、删除商品。
搜索系统:新增商品、修改商品、删除商品。
所以使用订阅模式实现商品数据的同步并不合理。
路由模式
图示
生产者
消费者1(前台系统)
消费2(搜索系统)
通配符模式
图示
生产者
消费者1(前台系统)
消费者2(搜索系统)
Spring-Rabbit
Spring项目
简介
使用
消费者
生产者
配置文件
- 定义连接工厂
- 定义模板(可以指定交换机或队列)
- 定义队列、交换机、以及完成队列和交换机的绑定
- 定义监听
- 定义管理,用于管理队列、交换机等:
持久化交换机和队列
持久化:将交换机或队列的数据保存到磁盘,服务器宕机或重启之后依然存在。
非持久化:将交换机或队列的数据保存到内存,服务器宕机或重启之后将不存在。
非持久化的性能高于持久化。
如何选择持久化?非持久化? -- 看需求。
实现商品数据的同步
使用什么队列模式?
使用通配符模式。
在后台系统中发送消息到交换机
导入依赖
队列和交换机的绑定关系
实现:
- 在配置文件中将队列和交换机完成绑定
- 可以在管理界面中完成绑定
- 绑定关系如果发生变化,需要修改配置文件,并且服务需要重启
- 管理更加灵活
- 更容易对绑定关系的权限管理,流程管理
配置
消息内容
方案:
- 将Item对象做json序列化发送
- 数据大
- 有些数据其他人是可能用不到的
- 发送商品的id、操作类型
实现
前台系统接收消息
导入依赖
配置
具体处理逻辑
在界面管理工具中完成绑定关系
搜索系统中接收消息
配置
处理业务逻辑
在管理工具中绑定队列和交换机
测试
测试结果:商品数据已经完成和索引数据的同步。
总结
使用MQ实现商品数据的同步优势:
- 降低系统间耦合度
- 便于管理数据的同步
淘淘商城_day08_课堂笔记的更多相关文章
- 淘淘商城_day11_课堂笔记
今日大纲 发布前的准备 实施发布 一部分是由我来发布 一部分是由你们来发布 讲解分布式部署架构 测试 功能测试 压力测试 项目实战的准备以及分组 分组 抽取功能 讲解所需要开发的功能 项目部署上线流程 ...
- 淘淘商城_day01_课堂笔记
今日大纲 聊聊电商行业 电商行业发展 11.11 2015双11: 2016年: 预测:2017年的双11交易额将达到:1400亿 电商行业技术特点 淘淘商城简介 淘淘商城的前身 电商行业的概念 B2 ...
- 淘淘商城_day04_课堂笔记
今日大纲 实现首页的大广告位功能 实现内容管理系统 首页的大广告 什么是大广告 JS效果: 点击下面的序号选择查询哪个广告 自动切换 点击图片查询具体的页面 以上是由前端团队来开发. 数据结构 说明: ...
- 淘淘商城_day02_课堂笔记
今日大纲 学习Nginx的使用 实现商品的管理 新增商品 查询商品列表 编辑商品 删除商品 上架和下架商品 学习nginx 开发阶段中的环境 开发环境:自己的电脑 测试环境:提供给测试人员使用的环境 ...
- 淘淘商城_day10_课堂笔记
今日大纲 Dubbo入门学习 使用dubbo优化单点登录系统 系统间服务调用方式 浏览器直接访问 浏览器发起请求,通过ajax或jsonp方式请求: Httpclient方式 系统与系统之间通过Htt ...
- 淘淘商城_day09_课堂笔记
今日大纲 实现购物车 基于Mysql实现读写分离 购物车 需求描述 用户可以在登录状态下将商品添加到购物车 用户可以在未登录状态下将商品添加到购物车 用户可以使用购物车一起结算下单 用户可以查询自己的 ...
- 淘淘商城_day07_课堂笔记
今日大纲 讲解订单系统 基于订单系统完成下单功能的开发 使用Solr完成商品的搜索功能 订单系统 说明:订单系统只是做讲解,不做开发. 导入taotao-order 表结构 订单表: 订单商品表: 疑 ...
- 淘淘商城_day05_课堂笔记
今日大纲 学习Redis 使用Redis完成项目中缓存需求 实现商品详情页功能 缓存的需求 大广告位数据无需每次查询后台系统的接口,可以在前台系统添加缓存,提高访问首页的速度. 商品类目的数据也可以缓 ...
- 淘淘商城_day06_课堂笔记
今日大纲 实现单点登录系统 基于单点登录系统实现,用户的注册和登录 商品数据同步问题 问题 后台系统中将商品修改,前台系统没有进行数据的同步,导致前端系统不能够实时显示最新的数据. 解决 后台系统中商 ...
随机推荐
- [ios2] ios7UI适配 【转】
http://blog.csdn.net/toss156/article/details/11843873#comments (1)如果应用程序始终隐藏 status bar 那么恭喜呢,你在UI上需 ...
- C#Redis列表List
一.前戏 在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis将 ...
- PRD学习笔记:一些需要注意的说明
控件说明 1)输入框 若输入框有默认提示,点击输入框,弹出软键盘. 当输入框内不为空(空格除外)时,默认显示消失. 2)软键盘的弹出及退去机制 当输入框内必须输入的为数字时,弹出数字软键盘.其余时候, ...
- 如何对Javascript代码进行二次压缩(混淆)
如何对Javascript代码进行二次压缩(混淆) 对Javascript代码进行压缩(混淆),可以有效减少传输和加载时间.但是,不是所有的变量(方法)都能被混淆的,一般来说,只有非属性的变量(方法) ...
- LR设置关联---部分内容摘自网络--望见谅
模拟环境---LR机票定票系统设置:首页点击administration-勾选Set LOGIN form's action tag to an error page.选项,点击update. 现在许 ...
- SDN基础
http://www.h3c.com.cn/Solution/Smart_Network/SDN/ http://network.51cto.com/network/content2013/SDNke ...
- 端口(port)的安全模式(security mode)
1. Cisco29系列交换机可以做基于2层的端口安全 ,即mac地址与端口进行绑定.2. Cisco3550以上交换机均可做基于2层和3层的端口安全, 即mac地址与端口绑定以及mac地址与ip地址 ...
- Map - leetcode [哈希表]
149. Max Points on a Line unordered_map<float, int> hash 记录的是斜率对应的点数 unordered_map<float, i ...
- android 控件注意点
控件一:listview 问题一:当listview的item中存在按钮这种控件时 item点击不能响应问题? 解决方案:在item的自定义控件的最外层空间 上添加属性 android:descend ...
- js便利json 数组的方法
这篇文章主要介绍了JQuery遍历json数组的3种方法,本文分别给出了使用each.for遍历json的方法,其中for又分成两种形式,需要的朋友可以参考下 $(function () { var ...