1. 今日大纲

  1. 问题,如何实现商品数据的同步?
  2. 学习MQ(消息队列)
    1. 搭建RabbitMQ的环境
    2. 学习RabbitMQ的队列
    3. 学习Spring-Rabbit
  3. 使用RabbitMQ完成商品数据的同步
  1. 如何实现商品数据同步

之前的数据同步的实现:

  1. 在前台系统开放接口
    1. 该接口中完成将Redis中的数据删除
  2. 后台系统在商品编辑、删除时调用该接口,即可实现商品数据的同步

该方案存在的问题: 系统间的耦合度太高了。

耦合度是指:其他团队的版本升级会影响到后端团队的版本升级。

商品的数据已经实现了和前台系统的同步,但是,搜索系统中索引数据没有和后台系统的数据同步,导致,后台系统的商品数据进行了更新,在搜索系统中搜索到的数据是旧的数据,也可以采用之前的方案解决,但是,因为系统间的耦合度太高了,所以不推荐使用该方案,所以需要使用MQ来解决该问题。

  1. RabbitMQ

    1. RabbitMQ的简介

开发语言:Erlang – 面向并发的编程语言。

  1. AMQP

AMQP是消息队列的一个协议。

  1. 官网

  1. MQ的其他产品

  1. 学习5种队列

  1. 安装文档

  1. 搭建RabbitMQ环境

具体参考《RabbitMQ-3.4.1安装手册.docx》

  1. 版本

推荐使用3.4.1版本。

  1. 安装

  1. 安装的注意事项

  1. 推荐使用默认的安装路径
  2. 系统用户名必须是英文
    1. Win8改名字非常麻烦,具体方法百度
  3. 计算机名必须是英文
  4. 系统的用户必须是管理员

如果安装失败的同学应该如何解决:

  1. 重装系统 -- 不推荐
  2. 将RabbitMQ安装到linux虚拟机中
    1. 推荐
  3. 使用别人安装好的RabbitMQ服务
    1. 只要给你开通一个账户即可。
    2. 使用公用的RabbitMQ服务,在192.168.50.22
    3. 推荐

错误:

  1. 安装完成后操作

1、系统服务中有RabbitMQ服务,停止、启动、重启

  1. 打开命令行工具

    如果找不到命令行工具:
  2. 启用管理插件
  3. 查看管理页面
  4. 通过默认账户 guest/guest 登录
    如果能够登录,说明安装成功。
    1. 添加taotao用户

  1. 管理界面中的功能

  1. 5种队列

  1. 导入itcast-rabbitmq

  1. 简单队列

    1. 图示

P:消息的生产者

C:消息的消费者

红色:队列

生产者将消息发送到队列,消费者从队列中获取消息。

  1. 导入RabbitMQ的客户端依赖

  1. 获取MQ的连接

  1. 生产者发送消息到队列

  1. 管理工具中查看消息

点击上面的队列名称,查询具体的队列中的信息:

  1. 消费者从队列中获取消息

  1. Work模式

  1. 图示

一个生产者、2个消费者。

一个消息只能被一个消费者获取。

  1. 消费者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);

}

}

}

  1. 消费者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);

}

}

}

  1. 生产者

向队列中发送50条消息。

  1. 测试

测试结果:

  1. 消费者1和消费者2获取到的消息内容是不同的,同一个消息只能被一个消费者获取。
  2. 消费者1和消费者2获取到的消息的数量是相同的,一个是奇数一个是偶数。

其实,这样是不合理的,应该是消费者1要比消费者2获取到的消息多才对。

  1. Work模式的"能者多劳"

测试:

消费者1比消费者2获取的消息更多。

  1. 消息的确认模式

消费者从队列中获取消息,服务端如何知道消息已经被消费呢?

模式1:自动确认

只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。

模式2:手动确认

消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。

手动模式:

自动模式:

  1. 订阅模式

  1. 图示

解读:

1、1个生产者,多个消费者

2、每一个消费者都有自己的一个队列

3、生产者没有将消息直接发送到队列,而是发送到了交换机

4、每个队列都要绑定到交换机

5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的

  1. 消息的生产者(看作是后台系统)

向交换机中发送消息。

注意:消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。

  1. 消费者1(看作是前台系统)

  1. 消费者2(看作是搜索系统)

  1. 测试

测试结果:

同一个消息被多个消费者获取。

在管理工具中查看队列和交换机的绑定关系:

  1. 使用订阅模式能否实现商品数据的同步?

答案:可以的。

后台系统就是消息的生产者。

前台系统和搜索系统是消息的消费者。

后台系统将消息发送到交换机中,前台系统和搜索系统都创建自己的队列,然后将队列绑定到交换机,即可实现。

消息,新增商品、修改商品、删除商品。

前台系统:修改商品、删除商品。

搜索系统:新增商品、修改商品、删除商品。

所以使用订阅模式实现商品数据的同步并不合理。

  1. 路由模式

  1. 图示

  1. 生产者

  1. 消费者1(前台系统)

  1. 消费2(搜索系统)

  1. 通配符模式

  1. 图示

  1. 生产者

  1. 消费者1(前台系统)

  1. 消费者2(搜索系统)

  1. Spring-Rabbit

    1. Spring项目

http://spring.io/projects

  1. 简介

  1. 使用

    1. 消费者

  1. 生产者

  1. 配置文件

  1. 定义连接工厂
  2. 定义模板(可以指定交换机或队列)
  3. 定义队列、交换机、以及完成队列和交换机的绑定
  4. 定义监听
  5. 定义管理,用于管理队列、交换机等:
    1. 持久化交换机和队列

持久化:将交换机或队列的数据保存到磁盘,服务器宕机或重启之后依然存在。

非持久化:将交换机或队列的数据保存到内存,服务器宕机或重启之后将不存在。

非持久化的性能高于持久化。

如何选择持久化?非持久化? -- 看需求。

  1. 实现商品数据的同步

    1. 使用什么队列模式?

使用通配符模式。

  1. 在后台系统中发送消息到交换机

    1. 导入依赖

  1. 队列和交换机的绑定关系

实现:

  1. 在配置文件中将队列和交换机完成绑定
  2. 可以在管理界面中完成绑定
    1. 绑定关系如果发生变化,需要修改配置文件,并且服务需要重启
    2. 管理更加灵活
    3. 更容易对绑定关系的权限管理,流程管理
  1. 配置

  1. 消息内容

方案:

  1. 将Item对象做json序列化发送
    1. 数据大
    2. 有些数据其他人是可能用不到的
  2. 发送商品的id、操作类型
  1. 实现

  1. 前台系统接收消息

    1. 导入依赖

  1. 配置

  1. 具体处理逻辑

  1. 在界面管理工具中完成绑定关系

  1. 搜索系统中接收消息

    1. 配置

  1. 处理业务逻辑

  1. 在管理工具中绑定队列和交换机

  1. 测试

测试结果:商品数据已经完成和索引数据的同步。

  1. 总结

使用MQ实现商品数据的同步优势:

  1. 降低系统间耦合度
  2. 便于管理数据的同步

淘淘商城_day08_课堂笔记的更多相关文章

  1. 淘淘商城_day11_课堂笔记

    今日大纲 发布前的准备 实施发布 一部分是由我来发布 一部分是由你们来发布 讲解分布式部署架构 测试 功能测试 压力测试 项目实战的准备以及分组 分组 抽取功能 讲解所需要开发的功能 项目部署上线流程 ...

  2. 淘淘商城_day01_课堂笔记

    今日大纲 聊聊电商行业 电商行业发展 11.11 2015双11: 2016年: 预测:2017年的双11交易额将达到:1400亿 电商行业技术特点 淘淘商城简介 淘淘商城的前身 电商行业的概念 B2 ...

  3. 淘淘商城_day04_课堂笔记

    今日大纲 实现首页的大广告位功能 实现内容管理系统 首页的大广告 什么是大广告 JS效果: 点击下面的序号选择查询哪个广告 自动切换 点击图片查询具体的页面 以上是由前端团队来开发. 数据结构 说明: ...

  4. 淘淘商城_day02_课堂笔记

    今日大纲 学习Nginx的使用 实现商品的管理 新增商品 查询商品列表 编辑商品 删除商品 上架和下架商品 学习nginx 开发阶段中的环境 开发环境:自己的电脑 测试环境:提供给测试人员使用的环境 ...

  5. 淘淘商城_day10_课堂笔记

    今日大纲 Dubbo入门学习 使用dubbo优化单点登录系统 系统间服务调用方式 浏览器直接访问 浏览器发起请求,通过ajax或jsonp方式请求: Httpclient方式 系统与系统之间通过Htt ...

  6. 淘淘商城_day09_课堂笔记

    今日大纲 实现购物车 基于Mysql实现读写分离 购物车 需求描述 用户可以在登录状态下将商品添加到购物车 用户可以在未登录状态下将商品添加到购物车 用户可以使用购物车一起结算下单 用户可以查询自己的 ...

  7. 淘淘商城_day07_课堂笔记

    今日大纲 讲解订单系统 基于订单系统完成下单功能的开发 使用Solr完成商品的搜索功能 订单系统 说明:订单系统只是做讲解,不做开发. 导入taotao-order 表结构 订单表: 订单商品表: 疑 ...

  8. 淘淘商城_day05_课堂笔记

    今日大纲 学习Redis 使用Redis完成项目中缓存需求 实现商品详情页功能 缓存的需求 大广告位数据无需每次查询后台系统的接口,可以在前台系统添加缓存,提高访问首页的速度. 商品类目的数据也可以缓 ...

  9. 淘淘商城_day06_课堂笔记

    今日大纲 实现单点登录系统 基于单点登录系统实现,用户的注册和登录 商品数据同步问题 问题 后台系统中将商品修改,前台系统没有进行数据的同步,导致前端系统不能够实时显示最新的数据. 解决 后台系统中商 ...

随机推荐

  1. HTTP协议系列(2)--顺带离职的一些想法

    一.聊聊离职感悟      来杭州也是将近3个月了,也迎来我的第一次辞职,有可能你会说我傻怎么不拿年终奖,也有可能你会不理解为什么3个月就要辞职:我只能说我是怀揣的梦想来的,我想着进一步的提升,想着成 ...

  2. 结构-行为-样式-Js函数节流

    最近一个面试官问了我一个函数节流的问题,然后感觉自己工作中遇到过这个问题,但是不知道这种形式就是函数节流.下面我来说下这个Js的高级问题,思路:函数节流就是防止用户高频调用某个事件而做的Js层面的处理 ...

  3. Java DB loadBalance 设计

    Java DB loadBalance 设计 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {backgr ...

  4. ActiveMQ的简单例子应用

    ActiveMQ是一种消息中间件,它实现了JMS规范,提供点对点和订阅-发布两种模式.下面介绍下ActiveMQ的使用: 一.环境的搭建 首先我们需要下载ActiveMQ的安装包,下载地址http:/ ...

  5. 讲解——Trie树(字典树)

          Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...

  6. cobbler 奇葩出错

    写此随笔,只是为了记录我安装cobbler遇到的奇怪问题,虽然这个问题很让我无语,但是竟然折腾了我一天.废话不多说,入题: 一如既往的按照以前的安装方式安装cobbler,不会出错的地方我就一带而过了 ...

  7. angularjs的懒加载

    1.angularJS懒加载依赖模块 //设置 .config [ '$ocLazyLoadProvider' ($ocLazyLoadProvider) -> # We configure o ...

  8. CentOS 添加本地yum源

    1 创建保存RPM包的路径: mkdir -p /share/CentOS/7/local/x86_64/RPMS 2 安装createrepo工具 yum install createrepo 3 ...

  9. jQuery的入门操作

    jQuery html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,add ...

  10. CSS3之响应式布局

    在没有C3的时候,响应式布局是通过js来实现的. 开始研究响应式web设计,CSS3 Media Queries是入门. Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以 ...