小编Ram*_*mon的帖子

在消费者重新连接之前,RabbitMQ会丢失消息

我实现了一个消费者,如果底层连接关闭,它会在一段时间后自动重新连接到代理.我的情况如下:

  1. 成功启动RabbitMQ服务器.
  2. 成功启动消费者.
  3. 发布消息,消费者成功收到消息.
  4. 停止RabbitMQ服务器,消费者将显示异常:

    com.rabbitmq.client.ShutdownSignalException:连接错误; 原因:{#method(reply-code = 541,reply-text = INTERNAL_ERROR,class-id = 0,method-id = 0),null,""}.

    然后消费者将在重新连接前睡60秒.

  5. 再次启动RabbitMQ服务器.
  6. 成功发布消息,命令'list_queues'的结果为0
  7. 60秒后,消费者再次连接到RabbitMQ,但现在收到的消息在步骤#6中发布.
  8. 发布第三条消息,消费者成功收到了消息.

在这种情况下,重新连接之前发布的所有消息都将丢失.我还做了另一个实验.

  1. 启动RabbitMQ,并成功发布消息(未启动任何消费者进程).
  2. 停止RabbitMQ,然后重启它.
  3. 启动消费者流程,成功接收步骤#1发布的消息.

注意:消费者的QOS是1.我已经研究过RabbitMQ几天了,根据我的理解,消费者应该在重新连接之前发布消息.请帮忙(我根据windows rabbitMQ运行测试).

以下是PUBLISHER:

ConnectionFactory factory = new ConnectionFactory();
factory.setHost(this.getHost());
connection = factory.newConnection();
Channel channel = connection.createChannel();               
channel = conn.createChannel();
// declare a 'topic' type of exchange
channel.exchangeDeclare(exchangeName, "topic");
// Content-type "application/octet-stream", deliveryMode 2
// (persistent), priority zero
channel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_BASIC, message);
connection.close();
Run Code Online (Sandbox Code Playgroud)

消费者如下:

    @Override
public void consume(final String exchangeName, final String queueName, final String routingKey,
        final …
Run Code Online (Sandbox Code Playgroud)

amqp rabbitmq

3
推荐指数
2
解决办法
7907
查看次数

服务器超出范围时basic-publish的超时

我的情况是rabbitmq服务器空间不足,如下所示

Filesystem                       1K-blocks    Used Available Use% Mounted on
/dev/mapper/ramonubuntu--vg-root   6299376 5956336         0 100% /
Run Code Online (Sandbox Code Playgroud)

生产者向服务器发布消息(消息需要持久化),然后将永久阻止,它将等待发布的响应.当然我们应该避免服务器空间不足的情况,但有没有任何超时机制让生产者退出等待?

我尝试过心跳和SO_TIMEOUT,它们都不起作用,因为网络工作正常.以下是我的制片人.

 protected void publish(byte[] message) throws Exception {
    // ConnectionFactory can be reused between threads.
    ConnectionFactory factory = new SoTimeoutConnectionFactory();
    factory.setHost(this.getHost());
    factory.setVirtualHost("te");
    factory.setPort(5672);
    factory.setUsername("amqp");
    factory.setPassword("amqp");
    factory.setConnectionTimeout(10 * 1000);
    // doesn't help if server got out of space
    factory.setRequestedHeartbeat(1);
    final Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();
    // declare a 'topic' type of exchange
    channel.exchangeDeclare(this.exchangeName, "topic", true);

    channel.addReturnListener(new ReturnListener() {

        @Override
        public void handleReturn(int replyCode, …
Run Code Online (Sandbox Code Playgroud)

rabbitmq

3
推荐指数
1
解决办法
2947
查看次数

分离为只读/写数据库

很多人说通过创建只读和只写数据库可以实现更高的性能,坦白说,我无法完全理解它.有些人告诉我写作需要很多不同的锁,这会减慢阅读速度......但正如我的理解,系统中的许多阅读都不需要锁定,例如oracle一致性读取,锁定如何影响阅读?除了我想要分片数据库,读/写分离提供更多价值吗?
您能否详细解释或提供一些外部资源,说明为什么读/写分离可以提供更高的性能,谢谢.

database

2
推荐指数
1
解决办法
1360
查看次数

标签 统计

rabbitmq ×2

amqp ×1

database ×1