我想确保在RabbitMQ崩溃的情况下不会丢失。有可能以某种方式使用RabbitMQ转储或备份它在磁盘上的所有队列吗?
我也听说过,一旦收到消息,即使它崩溃了,当它出现时,消息将可用。
那么您建议如何使该过程更可靠?
答案 0 :(得分:2)
在RabbitMQ中,可以使用队列和消息的持久性来实现。 队列持久性意味着其配置将存储在磁盘上。当RabbitMQ在崩溃后恢复时,队列将被恢复。因此可以这样做:
/**
* Validate the size of an array.
*
* @param mixed $attribute
* @param mixed $value
* @param array $parameters
*/
public function validateArraySize($attribute, $value, $parameters)
{
$data = array_get($this->data, $attribute);
if(!is_array($data)){
return true;
}
$validateSize = count($data) <= $parameters[0];
return $validateSize;
}
您所寻求的与消息持久性更密切相关。将delivery_mode标志设置为2发布所有消息。默认值为1,这使得消息仅驻留在RAM中。有关Python中的代码示例,请参阅this。摘录如下。
channel.queue_declare(queue='myQueue', durable=True)
请注意,启用邮件持久性会影响性能。设置为2时,RabbitMQ代理必须执行其他工作 向磁盘写入消息并从磁盘读取消息。
答案 1 :(得分:0)
最好的方法是创建RabbitMQ cluster,然后配置HA policies。
配置HA时,邮件将复制到其他节点。 如果一个节点崩溃,您可以访问其他节点。
您还可以备份通常包含配置和消息的Mnesia
目录,但某些消息可以保留在缓存中。
确保你应该停止rabbitmq应用程序。
我尝试使用HA。
另一种连续备份消息的方法是使用Shovel插件
如@Milind所述,使用持久性消息是最佳做法。
修改强>
您使用Tx Transaction
云请在此处阅读:
https://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/
Tx
可以解决您的问题,但会对性能产生重大影响。