RABBITMQ 向 LOGSTASH 发送消息

时间:2021-02-11 12:02:46

标签: rabbitmq logstash logstash-configuration

你能帮我在logstash中输入RabbitMQ吗? 我的应用程序将代码版本发送到 rabbitmq,然后它会存储在弹性堆栈中。 对于rabbitmq中的应用程序已创建队列 名称:app_version_queue; 类型:经典; 耐用:真实

然后使用该配置配置了 logstash:

input {
  rabbitmq {
    id => "rabbitmyq_id"
    # connect to rabbit
    host => "localhost"
    port => 5672
    vhost => "/"
    # INPUT - PRODUCERS
    key => "app_version_queue"
    # OUTPUT - CONSUMER
    # queue for logstash
    queue => "logstash"
    auto_delete => false
    # Exchange for logstash
    exchange => logstash
    exchange_type => direct
    durable => "true"
    # No ack will boost your perf
    ack => false
  }
}

output {
  elasticsearch {
    hosts => [ "elasticsearch:9200" ]
    index => "app_version-%{+YYYY.MM.dd}"
  }
}

它起作用了,但是现在,在 RabbitMQ 控制台中,我在表 Queued messages 中看到 准备就绪:914,444 未确认:0 总计:914,444

我在 rabbitmq 集群上的磁盘空间在 3 天内就用完了。 重启rabbitmq服务器后,所有空间都可用了。

更新: 所有的原因,为什么我这样做,我想从那个链 app=>rabbit=>nifi=>elastic 中删除 NIFI 我想做:app=>rabbit=>logstash=>elastic

  1. 队列:app_version 我的应用程序向 nifi=>ELASTIC 发送消息 Queue1 - app_version_queue
  2. 队列:logstash,我用logstash创建的 Queue2 - logstash

我尝试停止 NIFI 发送,但消息没有离开。

1 个答案:

答案 0 :(得分:0)

听起来好像你已经创建了两次基础设施:

  • 在 RabbitMQ 中手动一次
  • 一旦进入 LogStash 的配置选项

您需要的是三件事

  • 应用程序向其发布消息的交换。
  • 一个供 LogStash 使用的队列。
  • 那个交换和那个队列之间的绑定;队列将获得发布到交换器的每条消息的副本,并带有匹配的路由密钥。

你拥有的是所有这些

  • 一个名为 logs(手动创建)的交换,您的应用程序将消息发布到该交换。
  • 一个名为 app_version_queue 的队列(手动创建),没有任何消耗。
  • 一个绑定(手动创建)将消息副本从 logs 传送到 app_version_queue,然后它永远留在那里。
  • 一个名为 logstash 的交换(由 LogStash 创建),它不会向其发布消息。
  • 一个名为 logstash 的队列(由 LogStash 创建),LogStash 从中使用消息。
  • logstash 交换到 logstash 队列的绑定(由 LogStash 创建),它不执行任何操作,因为没有消息发布到该交换。
  • logs 交换器到 logstash 队列的绑定(手动创建),实际上是从您的应用程序传递消息。

因此,对于三件事(交换、队列和绑定)中的每一项,您需要:

  • 取个名字
  • 决定是您创建它,还是让 LogStash 创建它
  • 将所有内容配置为使用相同的名称

例如,您可以保留名称 logsapp_version_queue,并手动创建所有内容。

那么您的 LogStash 应用程序将如下所示:

input {
  rabbitmq {
    id => "rabbitmyq_id"
    # connect to rabbit
    host => "localhost"
    port => 5672
    vhost => "/"
    # Consume from existing queue
    queue => "app_version_queue"
    # No ack will boost your perf
    ack => false
  }
}

另一方面,您可以只创建 logs 交换,并让 LogStash 创建队列和绑定,如下所示:

input {
  rabbitmq {
    id => "rabbitmyq_id"
    # connect to rabbit
    host => "localhost"
    port => 5672
    vhost => "/"
    # Create a new queue
    queue => "logstash_processing_queue"
    durable => "true"
    # Take a copy of all messages with the "app_version_queue" routing key from the existing exchange
    exchange => "logs"
    key => "app_version_queue"
    # No ack will boost your perf
    ack => false
  }
}

或者您可以让 LogStash 创建所有,并确保您的应用程序发布到正确的交易所:

input {
  rabbitmq {
    id => "rabbitmyq_id"
    # connect to rabbit
    host => "localhost"
    port => 5672
    vhost => "/"
    # Create a new queue
    queue => "logstash_processing_queue"
    durable => "true"
    # Create a new exchange; point your application to publish here!
    exchange => "log_exchange"
    exchange_type => "direct"
    # Take a copy of all messages with the "app_version_queue" routing key from the new exchange
    key => "app_version_queue"
    # No ack will boost your perf
    ack => false
  }
}

我可能会选择中间的选项:交换是应用程序部署要求的一部分(如果不能在那里发布,它将产生错误),但由于不同的原因,任何数量的队列都可能绑定到它(在不需要设置 ElasticSearch 的测试环境中可能根本没有)。