1.文章定时发布流程

    # 1.涉及表: wm_news表、ap_author表、ap_channel表、ap_article表、ap_article_config表、 ap_article_content表

    # 2.业务流程:
    (1)自媒体文章提交审核通过后,通过RabbitMQ通知article服务进行文章的定时发布
    (2)当article服务接受到消息后,基于wemdia库中的自媒体文章信息封装app端文章信息,页面的静态化, 修改自媒体文章状态为已发布(9),并设置关联app端的文章信息id。
    (3)通知搜索修改文章信息

    # 3.实现流程:
    (1)自媒体文章自动审核或人工审核成功后,通过RabbitMQ死信队列通知article服务进行文章的定时发布
    1)判断当前文章是否到达发布时间
    2)如果到达发布时间,文章应立即发布,消息发送到发布文章队列
    3)如果未到达发布时间,计算距离文章发布时间的毫秒值,文章延时发布,消息发送到死信队列,并设置失效时间
    (2)当article服务监听接受到消息后,基于自媒体文章封装app端文章信息
    1)调用feign远程查询自媒体文章
    I.根据自媒体文章id通过weMediaFeign远程查询自媒体文章
    II.检查远程调用是否成功
    III.检查自媒体文章是否存在
    IV.检查自媒体文章状态 是否为4(人工审核通过)或 8(自动审核通过)
    2)封装数据到ApArticle
    I.将WmNews的数据封装到ApArticle
    II.封装频道信息,通过AdminFeign远程调用查询频道信息
    III.封装作者信息,根据自媒体文章的userId查询作者信息
    3)保存或修改文章APArticle信息
    I.根据id检查app端的文章是否存在
    II.如果不存在,保存文章信息
    III.如果存在,修改article,删除关联的文章配置信息和文章内容信息
    4)保存文章配置和内容信息
    I.保存文章配置信息
    II.保存文章内容信息
    5)页面静态化
    6)修改WmNews的文章状态 9(已发布)并关联articleId
    I.通过weMediaFeign远程调用修改WmNews的自媒体文章状态 9(已发布)及设置articleId
    7)通过RabbitMQ通知es更新索引库

    2.RabbitMQ实现延时队列方案
    # 延时任务 和 定时任务
    1.延时任务
    1)没有明确的触发时间
    2)在某件事情触发后一段时间内执行,没有执行周期
    3)延时队列一般是单个任务
    2.定时任务
    1)有明确的触发时间
    2)有执行周期
    3)定时任务一般执行的是批处理操作是多个任务
    # 延时任务解决方案
    1.定期轮询数据库
    1)优点:实现简单,可以部署集群,保证高可靠性,高可用性
    2)缺点:
    I.定时扫描频率过高,数据库压力比较大,扫描频率过低则实时性不能保证。
    II.高可用集群时需要保证多个扫描任务的线程安全,避免重复执行任务,可以利用分布式锁、乐观锁、保证接口幂等等各种方式来解决。
    2.DelayQueue
    1)优点:
    I.时效性好
    II.不引入其他服务依赖,wait-notify机制,不做polling,不会浪费cpu。
    2)缺点:
    I.数据保存在JVM内存中,当应用重启会造成数据丢失,或者数据量大时造成DelayQueue过大
    II.当前JVM内有效,应用与单进程场景
    3.定时任务(Quartz、xxljob)
    1)优点: I.实现简单 II.时效性好
    2)缺点: I.需要开启较多的定时任务,当业务并发量大时会带来CPU的额外负担 4.Redis键过期通知 1)
    优点:
    I.高可用,redis集群具备高并发、高可用的特性
    II.实时性,监听事件通知几乎是顺时的
    III.支持消息删除
    2)缺点:
    I.大量键同一时间过期,对redis来说负载大
    II.消息只会发送一次,没有确认机制,不能保证可靠性
    III.持久性受限于Redis
    IV.需要注意消息广播后的并发安全问题

    5.RabbitMQ 死信队列
    1)优点:
    I. 实现简单 II.可持久化 III.高可用集群 IV.性能强 V.实时性好

    2)缺点:
    I.无法删除消息
    II.如果是时间跨度非常大并且频率高的任务,不太适合 在我们项目中,选择RabbitMQ 死信队列来实现文章的定时发布。因为RabbitMQd的性能好,实现简单并且可以搭建集群,保证服务的高可用、可靠性。因此我们选择RabbitMQ的解决方案。

    3.项目中RabbitMQ的使用场景说明

    1.自媒体文章自动审核或人工审核成功后,通过RabbitMQ死信队列通知article服务进行文章的定时发布
    2.判断当前文章是否到达发布时间
    3.如果到达发布时间,文章应立即发布,消息发送到发布文章队列
    4.如果未到达发布时间,计算距离文章发布时间的毫秒值,文章延时发布,消息发送到死信队列,并设置失效时间

    4.自媒体文章上下架功能
    1.当自媒体用户在自媒体平台点击上下架时,通过RabbitMQ文章上下架队列通知article服务对文章配置表is_down字段进行的修改,从而到达app端文章的上下架