堆垛
我在RabbitMQ队列中有很多消息(在我的开发环境中运行在localhost上)。消息的有效负载是一个JSON字符串,我想直接加载到Elastic Search中(现在也在localhost上运行)。我写了一个快速的ruby脚本来从队列中提取消息并将它们加载到ES中,如下所示:
#! /usr/bin/ruby
require 'bunny'
require 'json'
require 'elasticsearch'
# Connect to RabbitMQ to collect data
mq_conn = Bunny.new
mq_conn.start
mq_ch = mq_conn.create_channel
mq_q = mq_ch.queue("test.data")
# Connect to ElasticSearch to post the data
es = Elasticsearch::Client.new log: true
# Main loop - collect the message and stuff it into the db.
mq_q.subscribe do |delivery_info, metadata, payload|
begin
es.index index: "indexname",
type: "relationship",
body: payload
rescue
puts "Received #{payload} - #{delivery_info} - #{metadata}"
puts "Exception raised"
exit
end
end
mq_conn.close
队列中有大约4,000,000条消息。
当我运行脚本时,我看到一堆消息,比如30,正好加载到Elastic Search中。但是,我看到大约有500条消息离开队列。
root@beep:~# rabbitmqctl list_queues
Listing queues ...
test.data 4333080
...done.
root@beep:~# rabbitmqctl list_queues
Listing queues ...
test.data 4332580
...done.
然后脚本静默退出而不告诉我异常。开始/救援块永远不会触发异常,因此我不知道为什么脚本提前完成或丢失了这么多消息。任何线索我应该如何调试它。
A
答案 0 :(得分:1)
我在这里添加了一个简单的工作示例:
当您不提供测试数据的示例时,很难调试您的示例。
Elasticsearch“river”功能已弃用,最终将被删除。如果RabbitMQ和Elasticsearch是您基础架构的核心部分,那么您应该花时间编写自己的自定义馈线。
答案 1 :(得分:0)
回答我自己的问题,然后我了解到将索引指令的消息队列加载到Elastic中是一种疯狂而愚蠢的方法。我创建了一条河流,并且可以比使用绳索脚本更快地排出指令。 ; - )