• 2.RabbitMq-持久化


    RabbitMq-消息持久化

    问题:怎样保证消息不因生产者gg而丢失
    我们知道了如何在消费者的角度保证消息不丢失,但如果生产者gg了呢,消息同样会丢失,生产者gg后会默认丢弃所有的消息,除非告诉它某些消息是不能丢失的。

    解决策略:消息持久化
    使用消息持久化,将消息保存到磁盘上,而不是内存中,即使生产者gg了,后面还可以通过读取磁盘来进行恢复。

    要实现消息持久化,我们需要做两件事:从queue与message分别来标记持久化。

    ①首先:从queue角度标记为持久化

    注意已经申明的队列不可以再次设置

    1 /**
    2 * @param queue the name of the queue
    3 * @param durable true if we are declaring a durable queue (the queue will survive a server restart) 如果我们声明一个持久队列,则为true(队列将在服务器重启后继续存在)
    4 * @param exclusive true if we are declaring an exclusive queue (restricted to this connection) 如果我们声明一个独占队列(仅限于此连接),则为true
    5 * @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use) 如果我们声明一个自动删除队列,则为true(服务器将在不再使用时将其删除)
    6 * @param arguments other properties (construction arguments) for the queue 队列的其他属性(构造参数)
    7 */
    8 boolean durable = true;
    9 channel.queueDeclare("hello", durable, false, false, null);

    声明队列时的第二个参数,设置为true。当然以上代码是有问题的,因为我们已经声明一个hello了,而且那个hello的持久化是false的,这里我们需要声明一个新的队列:queue_task

    1 boolean durable = true;
    2 channel.queueDeclare("task_queue", durable, false, false, null);

    ②从message的角度标记持久化
    我们已经标记了queue为持久化,重启后会读取磁盘保存的消息,那么还需要将消息标记为持久化:通过设置MessageProperties的值为:PERSISTENT_TEXT_PLAIN

     1 channel.basicPublish("", "task_queue",MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes()); 


    好了现在我们已经实现消息持久化了。

    注意:消息持久化并不能完全保证消息不丢失,级生产者需要将多个message保存到磁盘上,就在保存这个时间窗口上发生了意外,消息同样会丢失,尽管这个时间很短,但还是存在。不过话说回来,尽管这个持久化机制不能百分百地保证消息不丢失,但是做一些简单的任务还是够用的。

  • 相关阅读:
    图书管理系统(view)前后端调联 (copy)
    图书管理系统(modelviewset)前后端调联
    工单系统表的设计
    初始化工单项目及配置
    重要概念 什么是web容器 Linux下安装部署njinx+uwsgi+django+vue
    ubuntu下安装docker django使用whoosh搜索引擎 使用es(elasticsearch)代替whoosh
    RBAC权限管理基本概念与实现
    Django支付宝(沙箱)后端接口
    使用七牛云上传 并将本地图片视屏上传
    展示课程
  • 原文地址:https://www.cnblogs.com/Mao-admin/p/10033678.html
Copyright © 2020-2023  润新知