备份/还原rabbitmq队列

rabbit_droppings的Python项目详细描述


这是一个用于保存和加载rabbitmq的python库和实用程序 与磁盘之间的消息。

为什么?

  • 程序无法将消息发布到rabbitmq,但不希望 失去信息。使用这个库,程序可以保存 向文件发送消息。后来,在修复问题后,一个人可以使用 此包中用于发布消息的实用程序。
  • 消费者有一个bug,消息堆积在队列中。你 修正了这个错误,你的测试似乎表明消费者会 现在工作,但你需要一些保险。在此使用程序 包,您可以将队列备份到文件。如果程序 不正确地处理消息,您可以使用 从文件还原队列的包。
  • 您要编辑队列中的消息。您可以将队列转储到 文件,使用文本编辑器或一次性程序更改文件,以及 然后将消息写回队列。

为什么不呢?

这个图书馆是全新的,没有经过战斗测试。继续 小心。

备份格式

队列是从包含json的文本文件中备份和还原的。每个 文件中的行是一个json字典,其结构如下:

{
    "body": "This is a test",
    "delivery_info": {
        "delivery_tag": 1
    },
    "properties": {
        "app_id": null,
        "cluster_id": null,
        "content_encoding": null,
        "content_type": "text/plain",
        "correlation_id": null,
        "delivery_mode": 2,
        "expiration": null,
        "headers": {
            "client_id": null,
            "host_ip": "10.0.0.15",
            "host_name": "treebeard",
            "library_id": "olio_msg (Python) 1.9.0",
            "metadata_version": "1.0.0",
            "program_name": "olio_msg_send_test_messages",
            "version": "1.0.0"
        },
        "message_id": "1df3eb23ffeb476b8355d87b475eb627",
        "priority": null,
        "reply_to": null,
        "timestamp": 1434644774,
        "type": "test",
        "user_id": null
    }
}

这一行打印得很漂亮,但实际上只有一行:

{"body": "This is a test", "delivery_info": {...}, "properties: {...}}

使用命令行实用程序

备份队列

rabbit_droppings --host localhost --queue jobs \
  --file /path/to/save/file --dump

备份和清除队列

rabbit_droppings --host localhost --queue jobs \
  --file /path/to/save/file --purge

恢复队列

rabbit_droppings --host localhost --queue jobs \
  --file /path/to/save/file --restore

使用Pika库保存消息

如果有一个程序使用pika库将消息发布到 rabbitmq服务器,下面是如何保存 发布时间:

首先,导入库:

import rabbit_droppings

如果您有一个程序需要保存无法保存的消息 使用pika库发布,它应该创建 rabbit_droppings.writer(可能在构造函数中):

file = open('/path/to/my/file', 'a')
self._rd_writer = rabbit_droppings.Writer(file)

当您发布一条消息并且发生pika异常时,保存 消息:

body = "Message body"
properties = pika.spec.BasicProperties(
    content_type='text/plain'
    )
try:
    channel.basic_publish(exchange='',
                          routing_key='some_queue_name',
                          properties=properties,
                          body=body)
except (pika.exceptions.AMQPError, pika.exceptions.ChannelError) as e:
    pika_message = rabbit_droppings.PikaMessage(body, properties=properties)
    self._rd_writer.write(pika_message)

版本控制

这个库实践Semantic Versioning

这个库当前在alpha中;它的版本看起来像“0.1.0”, “0.2.0”等。α版本没有任何保证:任何版本 bump可以是bug修复、向后兼容api的任意组合 更改或中断API更改。

当库变得稳定时,它的版本号将被调到 “1.0.0”。语义版本控制保证了稳定版本:

  • 修补程序级别的版本凹凸(例如“1.0.0”到“1.0.1”)不会更改 公共api。
  • 小级别的版本凹凸(例如“1.0.0”到“1.1.0”)会更改 以向后兼容的方式公开api。
  • 主版本凹凸(例如“1.0.0”到“2.0.0”)会更改 公共api在某种程度上是不向后兼容的。

python版本

已知可用于python版本:

  • 2.6.9
  • 2.7.9

开发

运行测试需要在本地安装rabbitmq服务器。这个 已知这些rabbitmq版本通过了测试:

  • 3.4.1

运行测试:

./setup.py test

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
检查java中两个链表之间的子集   java仅在findViewById()下显示一个ImageButton   在Java Graphics2D中,文本如何在矩形上居中对齐?   java需要一个用于电子表格计算器的正则表达式   ^java中的运算符   java通过一些属性配置文件根据环境动态更改wsdl端点URL   java Ebean/Play框架关系未更新   集合如何将POJO列表转换为Java流中的映射<String,List>?   java为什么JFrame不显示整个图像?   java如何将调用静态导入的泛型方法的结果传递给另一个方法?   迭代器或foreach中的java延迟   需要java socket logback日志接收器   在Java中初始化Map的静态数组   雅加达邮件Java MimeMail:解码后获得额外字符   java为什么这个xmldom解析器不能正确解析rtept、name和cmt标记?   java如何刷新Log4J2中的异步记录器(带中断器)   java使用构建插件pom生成的jar。xml作为同一pom中的依赖项   java基于位置的序列ADT如何在O(1)时间内插入元素?   java ORM实体与DDD实体   Java对象分配