业务:

运用数据与信息指导小药工的采购生产与销售行为

需求背景:

(1)药工汇小程序用户(即小型中药初加工用户)需要知道自己加工的品种的价格涨跌信息和品种相关资讯)

需求分析拆解:

(1)使用爬虫程序脚本从中药材天地网上爬取价格和资讯相关信息(爬虫)

(2)此爬虫程序的执行使用定时任务管理(定时任务)

(3)爬虫获取的信息持久化到mongodb数据库(数据持久化)

(4)药工汇得到的信息的过程使用发布订阅模型,每个指向相同Redis主机数据库的连接为一个订阅者或发布者,一级分发频道为平台名称,二级分发频道为品种名称,订阅者无需点击订阅,订阅是根据主营品种自动默认完成订阅的(发布与订阅)

(5)统一调度守护程序轮询所有消息,根据频道将信息使用消息模板分发到每个订阅者,这样,此守护进行长时间占用CPU,效率低;可以改为使用定时任务,例如8:00-20:00每隔1小时执行一次消息轮询脚本;使用微信服务号的模板消息向用户推送信息(统一调度轮询守护进程)

技术理论:

1. 观察者模式与发布订阅模型的区别

(1)观察者模式图解

(2)发布-订阅模型图解

(3)两者的区别

a. 从图解中可以看出,观察者模式没有调度中心作为中转,直接将观察者注册到目标,发生事件时目标直接更新通知观察者; 发布订阅模型则以调度中心作为中转,订阅者将事件注册到调度中心,发生事件时发布者将信息发送给调度中心进行统一调度,调度中心将信息推送给订阅者

b. 相对来说,观察者模式是存在依赖的;发布订阅模型是松耦合的

2. 发布订阅与RestAPI的优缺点场景对比

(1)发布订阅的优缺点及场景

发布订阅本质上是服务器(发布者)向客户端(订阅者)反向推送的机制;

优点:

a. 是达到了最高的实时性,因为服务器数据的更新同时推向了客户端;

b. 一次性为单条数据同步

c. 采用事件回调的方式更新数据,总体上是异步的

缺点:

a. 是用户可能会很烦,因为用户是被动接收的(即使是用户根据标签,用户自己订阅的,用户依然可能会很烦),而且信息很可能不是精准用户想要的信息;

b. 每更新一条数据则同步一次,同步次数频繁

场景:

是用户迫切需要某一标签的信息或者数据

(2)RestAPI的优缺点及场景

RestAPI本质上是客户端向服务端正向请求的机制,原理和发布订阅刚好相反;

优点:

a. 是客户端根据自己的意愿请求数据,得到的信息是精准的;

b. 一次性同步一个时间段内所有数据, 体现为数据同步的批量操作

c. 采用主动同步请求的方法,是同步的

缺点:

是没有发布订阅的高实时性,不过一般来说,用户不需要这么高的实时性;

场景:

是通用情况

例如:下面的信息平台和药工汇平台数据同步的方案比较

 
方案  详细说明  特点  需要做什么
方案1:使用发布订阅模型同步更细数据

信息平台已经向频道发布数据,

需要做的是在时间回调函数中 调用药工汇平台提供的RestAPI,此RestAPI的内容为更新药工汇的数据,

为INSERT操作,PUT操作;

1. 及时同步

2. 异步执行

3. 单条多批次同步

4. 事件触发

1. 只需药工汇平台提供RestAPI, 此RestAPI为PUT操作,INSERT操作;

需传入的参数有访问药工汇平台的平台级access_token,药工汇平台做access_token验证;

需关心药工汇平台数据库结构(主要工作在药工汇)

方案2:使用定时任务请求RestAPI获取数据

信息平台已经向频道发布数据,

需要做的是使用定时任务跨域请求 信息平台提供的RestAPI,此RestAPI的内容为从频道中获取数据,

为SELECT操作, LIST操作

1. 延时同步

2. 同步执行

3. 批量同步

4. 定时任务触发

1. 只需信息平台提供RestAPI,此RestAPI为LIST操作,SELECT操作;

需传入的参数有访问信息平台的平台级access_token,信息平台做access_token验证;

无需关系药工汇平台数据库结构;药工汇配置定时任务(主要工作在信息平台)

2. Redis中发布订阅的架构

(1)图解

包括:

a. 订阅者订阅一个或多个频道

b. 订阅者使用模式匹配订阅多个频道

c. 订阅者取消订阅频道

d. 发布者向某个频道发布消息

3. Redis的发布订阅实验(验证已订阅的客户端是否会自动收到消息)

预期:

Redis-client_2在步骤(2)不会收到消息

Redis-client_2在步骤(3)不会收到消息

Redis-client_2在步骤(4)收到消息

步骤:

(1)启动Redis服务器和两个Redis客户端:启动Redis-server,启动Redis-client_1和Redis-client_2

结果:服务器和两个客户端已经成功启动

(2)在Redis-client_1向频道channel_1发送一条消息,消息内容为 "Hello, Word!"; 观察Redis-client_2是否收到此消息

结果:客户端2未订阅任何频道则无法收到消息

(3)在Redis-client_2订阅频道channel_1; 观察Redis-client_2是否收到消息Hello,World!

结果:客户端2订阅了频道1无法收到订阅前发送到频道1的任何消息

(4)在Redis-client_1向频道channel_1发送一条消息,消息内容为 "Good afternoon!"; 观察Redis-client_2是否收到此消息

结果:客户端2能收到订阅后发送到此频道的任何消息

结论:实验结果和预期猜想相符,Redis客户端只能被动接收到订阅此频道发送的消息

4. Redis发布订阅实验(原生PHP+php_redis扩展)

准备:

(1)安装好php_redis扩展(在windows上需要下载php_redis.dll并放入php/extra中;在php.ini中加入extension=php_redis.dll)

注意:

a. 下载php_redis.dll对应版本时需要查看phpinfo中php的版本,php是32位还是64位的,php的thread是否为safety

b. 需要将extension=php_redis.dll放入apache/php.ini和php/php.ini中

(2)启动Redis服务器及启动Redis客户端1

(3)编写Redis客户端2订阅的脚本,如下:

<?php
//避免在默认的配置下,1分钟后终端了与redis服务器的链接
ini_set('default_socket_timeout', -1);
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis->subscribe(['channel_1'], function($redis, $channel, $msg){
    var_dump($redis);
    var_dump($channel);
    var_dump($msg);
});
?>

启动脚本运行,并在客户端1发送一条消息,观察客户端2:

3. 其他发布订阅框架例如ActiveMQ与 Redis的区别

平台交互图:

编码实现:

服务器运维:

参考:

1. 观察者模式与发布订阅模式的区别

https://www.cnblogs.com/lovesong/p/5272752.html

2. Redis的发布订阅机制

https://www.cnblogs.com/yitudake/p/6747995.html

Redis的发布与订阅的更多相关文章

  1. redis实现发布(订阅)消息

    redis实现发布(订阅)消息 什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能.基于事件的系统中,Pub/S ...

  2. Redis的发布和订阅

    Redis的发布和订阅 Redis发布订阅(pub/sub)是一种消息通信模式,pub发布消息,sub接收消息.(pub/sub)是一种生产者消费者模式,是实现消息队列的一种方式 redis的订阅和发 ...

  3. redis的发布与订阅机制

    Redis 发布/订阅机制原理分析 Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能. 这些命令被广泛用于构建即时通信应用,比如网络聊天室(c ...

  4. 一文带你了解 Redis 的发布与订阅的底层原理

    01.前言 发布订阅系统在我们日常的工作中经常会使用到,这种场景大部分情况我们都是使用消息队列的,常用的消息队列有 Kafka,RocketMQ,RabbitMQ,每一种消息队列都有其特性,关于 Ka ...

  5. redis:消息发布与订阅频道

    1. 发布与订阅频道 消息发布与订阅像收音机与广播台的关系 1.1. publish channel message 发布频道 语法:publish channel message 作用:发布频道消息 ...

  6. springboot使用redis实现发布与订阅

    配置redis连接地址 # Redis服务器地址 spring.redis.host=youxiu326.xin # Redis服务器连接端口 spring.redis.port=6379 # Red ...

  7. springboot2.0整合redis的发布和订阅

    1.Maven引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  8. redis的发布和订阅操作

  9. Redis - 发布和订阅

    一.概述 1). 发布和订阅是一种消息通信模式. 2). 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式. 二.发布和订阅 订阅命令: // 订阅一个或多个频道 // 返回值:v ...

随机推荐

  1. 罗汉果与Java虚拟机系列目录与说明

    声    明 罗汉果与Java虚拟机系列博文仅为本银结构性整合Java虚拟机知识的笔记和日常JVM问题的DEBUG记录.放到网上主要是为了方便自己今后查看.顺带能帮助到别人就更奈斯了. 目    录 ...

  2. 搞懂 JavaScript 继承原理

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

  3. finereport报表--动态格间运算 二

    报表输出

  4. TS学习随笔(五)->函数

    这篇文章我们来看一下TS里面的函数 函数声明 在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expre ...

  5. TS学习随笔(四)->数组的类型

    少侠们,今天我们继续来搞一搞TS 今天我们要来看一看TS中数组的定义是个什么鬼样子 数组的类型: 在 TypeScript 中,数组类型有多种定义方式,比较灵活.下面我们来看看有哪些定义方法 「类型 ...

  6. 微信小程序 从含有tabbar的页面跳转到不含有tabbar的页面

    如何离开含有tabbar的页面 在微信小程序开发过程中,我们会碰到从某页跳转到一个含有tabbar的页面的需求, 用 wx.navigateTo({url: '...',})  不起作用,需要使用 w ...

  7. 章节十、1-用ID和XPath、name定位元素

    一.在定位元素时需要HTML标签,HTML是超文本标记语言,我们打开web网页是看到的内容就是通过html语言来实现的,按键盘“F12”调用开发者选项后,“Elements”栏中显示的就是网页的HTM ...

  8. ORA-12537: Network Session: End of file

    最近开发组同事使用Azure的Function App访问公司内部的Oracle数据库时,偶尔会遇到"ORA-12537: Network Session: End of file" ...

  9. China Tightens Recycling Import Rules

    China Tightens Recycling Import Rules We have all seen the pictures of cities in China with air poll ...

  10. Redis学习笔记(1)——Redis简介

    一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...