标签: rabbitmq

陈旧的rabbitmq数据队列文件占用磁盘空间

我们的一台测试部署服务器上的磁盘已满。它通常运行多个 docker 容器,其中几个使用rabbitmq 进行通信(也作为容器运行,镜像rabbitmq:3.8-management)。运行后docker-compose down大约3Gb磁盘空间被释放,并docker-compose up -d成功启动一切。

在调查磁盘已满的原因时,最大的贡献者是 /var/lib/docker/volumes,它使用了 63Gb 磁盘空间。

root@...:/var/lib/docker/volumes# du -s * | sort -nr | head -20
10937880        ca7780bbddd7ce3e4cb9074fc9cad60b9c3b0bf184436ac8f0545fe513e09b31
777792  ff949d7a36874231e2cc9184efbd6a5dcbad1c5931dc97aa03f2353c07af662a
526308  ffc6a025921c6cd32336f402e5f6fc50c1e8bf1ff8c3ed0a145fbcc24d778954
524972  921e79b99d80c040968da6abd906125026d133b5ad790c455bf5912966586de6
518308  c4796d0a7866de9cdc2ae752217e17a20ff4670fdb5dc2538b11be3b9f2bc20a
517352  ef0667fbe6b3049f390ed9a32480515db1a6491d31ba8021cba351851e4177cd
516616  7a230b2ade824f92905c52b5e7ed7b29aafe685de4e5334fe893139e1266db81
515968  c81dbd0a64ae5b120a643d564e29a67a65eb0a8535c986c36872c0999ecc4d6c
514108  283b55310eba29bfa197d2cdacfb4198188df4e6a43e02ee4f0bba91a26b58e6
512200  3e761db0bec2102b1fb76a4fcfddca1ab5473d535c8060d95ac266901073db36
510316  ceef371f07df37fffe36297e13645bc45a934d7cace9008427b4320f95cbf757
509024  390ca3483aa0d7a7a78f83825fb3c6949e66f60aba40daa5dec224692e790a2f
503556  9b450cf79f63b65a1b0b5f91116c20b5fd2759c102c20df1740020598c24edcd
501164  cbdd8ef3500c5ddd3cca27a6037e3851f8698fb6b2df7b1a16c4272475101f1d
500784  e84d84ece86c2966649141f2eb362f66c9e29e33eb1eebdd1da8e59e8ab85b6e
500312  27935ab135130f336d4947c8a450213ea6ca18db0eab76ee46ed35cff7491e0e
491584  619edf2f5bf74795df75581ed8ed79f8c117363ffe2272f20dfc9c460345947a
491440  f6e6eaba7f584796c548c3313993f9b7999c8ad29389ac7577ebb4f24d53c8ce
488288  2f4a8295042d1abcb19cfc8f81d12ae1a0aba297c0ac3161d001c1bfb48e0ee2
488216  b73a38a4250b3e75c019b43f67afa78f2f101789b0696985f9029eccec763f0b
root@...:/var/lib/docker/volumes#
Run Code Online (Sandbox Code Playgroud)

忽略两个最大的卷,剩余磁盘空间的大部分被各种 00000001.wal 文件占用:

root@...:/var/lib/docker/volumes# find . -name '*.wal' -print0 | xargs -0 ls -lSh …
Run Code Online (Sandbox Code Playgroud)

rabbitmq

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

SpringBoot + Rabbitmq - DLQ 队列不工作

我已经设置了 dlq 和 dlx,但失败的消息没有重定向到 dlq。我正在尝试从java应用程序以及从rabbitmq服务器发送消息到MESSAGES.EXCHANGE,在这两种情况下我都会收到消息,但在抛出异常消息后应该重定向到DLX.MESSAGES.EXCHANGE,但它正在发生。

下面是java代码和rabbitmq服务器的屏幕截图。一切对我来说看起来都不错。在代码或rabbitmq服务器中找不到任何问题。

队列设置代码-

public class DLQAmqpConfiguration {
    public static final String DLX_MESSAGES_EXCHANGE = "DLX.MESSAGES.EXCHANGE";
    public static final String DLQ_MESSAGES_QUEUE = "DLQ.MESSAGES.QUEUE";

    public static final String MESSAGES_QUEUE = "MESSAGES.QUEUE";
    public static final String MESSAGES_EXCHANGE = "MESSAGES.EXCHANGE";
    public static final String ROUTING_KEY_MESSAGES_QUEUE = "ROUTING_KEY_MESSAGES_QUEUE";

    @Bean
    Queue messagesQueue() {
        return QueueBuilder.durable(MESSAGES_QUEUE)
                .withArgument("x-dead-letter-exchange", DLX_MESSAGES_EXCHANGE)
                .build();
    }

    @Bean
    DirectExchange messagesExchange() {
        return new DirectExchange(MESSAGES_EXCHANGE);
    }

    @Bean
    Binding bindingMessages() {
        return BindingBuilder.bind(messagesQueue()).to(messagesExchange()).with(ROUTING_KEY_MESSAGES_QUEUE);
    }

    @Bean
    FanoutExchange deadLetterExchange() {
        return new FanoutExchange(DLX_MESSAGES_EXCHANGE);
    }

    @Bean …
Run Code Online (Sandbox Code Playgroud)

rabbitmq spring-rabbit spring-boot

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

MassTransit/RabbitMq 错误队列 - 如何删除消息?

我有一个队列 {QueueName}。我定义了消费者和错误消息消费者如下:

                        cfg.ReceiveEndpoint
                        (
                            queueName: QueueName,
                            e =>
                            {
                                 e.UseMessageRetry(r => r.Immediate(2));

                                e.AutoDelete = false;
                                e.Durable = true;
                                e.Consumer(() => container.Resolve<My_Consumer>());
                                e.Consumer(() => container.Resolve<My_Fault_Consumer>());
                            }
                        );
                    
Run Code Online (Sandbox Code Playgroud)

当消费者耗尽处理消息的尝试次数时,故障消息消费者就会启动并通过记录错误来处理消息。我注意到创建了额外的队列,名为 {QueueName}_error。

My_Fault_Consumer 不确认故障消息消耗并且队列增长。

如何确认这些消息?

c# masstransit rabbitmq

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

如何将带有参数(闭包)的Python函数传递给另一个函数?

我是一名Python菜鸟,目前正在使用rabbitMQ。我从rabbitMQ 收到有效负载并对其进行处理。这是第一个函数

def verify_user_id(ch, method, properties, body):
    print("[*] Received message for NIN verification")
    body = json.loads(body)  # convert JSON string to python object
    parameters = body.get('parameters')
    id_info = {
        'first_name': parameters.get('first_name'),
        'last_name': parameters.get('last_name'),
        'country': parameters.get('country'),
        'id_type': parameters.get('id_type'),
        'id_number': parameters.get('id_number'),
        'entered': parameters.get('entered')
    }
    partner_params = {
        'job_id': parameters.get('job_id'),
        'user_id': parameters.get('user_id'),
        'job_type': parameters.get('job_type')
    }
    return body, id_info, partner_params
Run Code Online (Sandbox Code Playgroud)

现在,我想使用上面的函数向服务器发送请求,如下所示:

def smile_identity_func():
    body, id_info, partner_params = verify_user_id()
    try:
      
         connection = IdApi(str(partner_id), str(api_key), sid_server)
         response = connection.submit_job(partner_params, id_info)
         obj = response.json()
         return jsonify(obj)
        
        ch.basic_ack(delivery_tag=method.delivery_tag) …
Run Code Online (Sandbox Code Playgroud)

python rabbitmq pika

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

RabbitMQ:在关闭并重新打开的通道上确认/否认消息

我从 RabbitMq 服务器收到此错误

通道被服务器关闭:406(PRECONDITION-FAILED),消息为“PRECONDITION_FAILED - 未知的交货标签 80”

发生这种情况是因为在消费者任务期间连接丢失,最后,当消息被确认/确认时,我收到此错误,因为我无法在与我收到消息的通道不同的通道上确认消息。

这是 RabbitMq 连接的代码

async connect({ prefetch = 1, queueName }) {
    this.queueName = queueName;
    console.log(`[AMQP][${this.queueName}] | connecting`);
    return queue
        .connect(this.config.rabbitmq.connstring)
        .then(conn => {
            conn.once('error', err => {
                this.channel = null;
                if (err.message !== 'Connection closing') {
                    console.error(
                        `[AMQP][${this.queueName}] (evt:error) | ${err.message}`,
                    );
                }
            });

            conn.once('close', () => {
                this.channel = null;
                console.error(
                    `[AMQP][${this.queueName}] (evt:close) | reconnecting`,
                );
                this.connect({ prefetch, queueName: this.queueName });
            });
            return conn.createChannel();
        })
        .then(ch => {
            console.log(`[AMQP-channel][${this.queueName}] created`);
            ch.on('error', …
Run Code Online (Sandbox Code Playgroud)

rabbitmq node.js node-amqplib

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

Rabbitmq创建一个新用户并设置权限仅访问vhost下的特定队列

我在线找到了在rabbitmq上添加/创建新用户的步骤,示例文档

但我的内部团队有一个特殊要求,允许用户仅访问虚拟主机下的某些特定服务/队列/

现在,我创建的用户可以访问虚拟主机/下的所有队列

假设,如果我们需要更改它们的权限以仅访问虚拟主机 / 下的特定队列/服务(例如 cart-order1、cart-order2、cart-order3),我们该怎么做?

rabbitmq rabbitmqctl

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

Masstransit RabbitMQ 8.0.3 版本中的 IRabbitMqBusFactoryConfigurator.ConfigureJsonSerializer 在哪里?

我们从 Masstransit 7.0.6 升级到 8.0.3

之前我们正在配置ConfigureJsonSerializer. 但这似乎从 8.0.3 版本中删除了。源代码如下

x.UsingRabbitMq((context, cfg) =>
{
    cfg.Host(Config.GetValue<string>("RabbitMQ:Host"), "/", h =>
    {
        h.Username(Config.GetValue<string>("RabbitMQ:Username"));
        h.Password(Config.GetValue<string>("RabbitMQ:Password"));
    });

    cfg.ConfigureEndpoints(context);

    cfg.ConfigureJsonSerializer(settings => { settings.DefaultValueHandling = DefaultValueHandling.Include; return settings; });
});
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我们如何替换ConfigureJsonSerializerDefaultValueHandling

我看到有

cfg.UseJsonSerializer();
cfg.ConfigureJsonSerializerOptions(options => options.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.???);
Run Code Online (Sandbox Code Playgroud)

这是正确的替代品吗DefaultIgnoreCondition

masstransit rabbitmq

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

Zipkin 无法在 Docker 中工作 - 连接被拒绝

Zipkin 在本地运行良好,但在 docker 容器中运行不佳。所有的微服务都在Eureka中注册良好,并且可以很好地通信。但唯一的问题是Zipkin。我收到以下错误:

org.springframework.web.client.ResourceAccessException:“http://localhost:9411/api/v2/spans”的 POST 请求出现 I/O 错误:连接到 http://localhost:9411 [localhost/127.0.0.1]失败:连接被拒绝

我的 docker-compose.yaml 如下:

version: '3.8'

services:
  currency-exchange:
    image: samankt/springboot-udemy-currency-exchange:0.0.1-SNAPSHOT
    mem_limit: 512m
    ports:
      - '8000:8000'
    networks:
      - saman-network  
    environment:
      EUREKA.CLIENT.SERVICE-URL.DEFAULTZONE: http://naming-server:8761/eureka
      EUREKA.INSTANCE.PREFERIPADDRESS: true  
      SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/
      RABBIT_URI: amqp://guest:guest@rabbitmq:5672
      SPRING_RABBITMQ_HOST: rabbitmq
      SPRING_ZIPKIN_SENDER_TYPE: rabbit
    depends_on:
      - naming-server
      - rabbitmq
      
  api-gateway:
    image: samankt/springboot-udemy-currency-api-gateway:0.0.1-snapshot
    mem_limit: 512m
    ports:
      - '8765:8765'
    networks:
      - saman-network  
    environment:
      EUREKA.CLIENT.SERVICE-URL.DEFAULTZONE: http://naming-server:8761/eureka
      EUREKA.INSTANCE.PREFERIPADDRESS: true  
      SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/
      RABBIT_URI: amqp://guest:guest@rabbitmq:5672
      SPRING_RABBITMQ_HOST: rabbitmq
      SPRING_ZIPKIN_SENDER_TYPE: rabbit 
    depends_on:
      - naming-server
      - rabbitmq
      
  currency-converter:
    image: samankt/currency-conversion:0.0.1-SNAPSHOT
    mem_limit: 700m …
Run Code Online (Sandbox Code Playgroud)

rabbitmq docker zipkin spring-boot microservices

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

使用 RabbitMQ 广播大型对象是否安全?

我对 RabbitMQ 比较陌生,发现它非常方便和快捷,我用它通过 ruby​​ + bunny gem 来通信小对象。

现在我尝试传递每个大约 10~20MB 的对象进行交换,并将其扇出给其订阅者。

看起来工作正常,但是使用 RabbitMQ 作为发布者是一个好的做法吗?或者我应该对 RabbitMQ 使用一些猜想?

ruby rabbitmq

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

如何区分 int null 和默认为零的 int 实际上等于零?

我是一个长期使用 Go 的 python 用户,我仍然有一些问题需要重新获得管理打字和指针的基本技能。

我有一个程序从 RabbitMq 接收事件(但无论我们在谈论什么传输,问题都是一样的)。其中一个甚至包含一个类型为 int 的可选字段 F1。

我的理解是,如果该字段在事件中不存在,那么 go 会将其默认为 0。但是 0 是该字段的有效值,我需要区分值为 0 的情况和值为 0 的情况未定义。

我想将我的字段设为 *int 以实际将“nil”作为值。但是当接收到一个事件时,F1 会被设置为实际指向的值,还是来自发送者的值地址?我还有其他选择吗?

go rabbitmq

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