elasticsearch,rabbitmq,bunny,Ruby,Json,elasticsearch,Rabbitmq,Bunny" /> elasticsearch,rabbitmq,bunny,Ruby,Json,elasticsearch,Rabbitmq,Bunny" />

Ruby-elasticsearch&;RabbitMQ-数据导入丢失,脚本无声崩溃

Ruby-elasticsearch&;RabbitMQ-数据导入丢失,脚本无声崩溃,ruby,json,elasticsearch,rabbitmq,bunny,Ruby,Json,elasticsearch,Rabbitmq,Bunny,堆垛机 我在RabbitMQ队列中有很多消息(在我的开发环境中的localhost上运行)。消息的有效负载是一个JSON字符串,我想直接加载到弹性搜索中(目前也在localhost上运行)。我编写了一个快速ruby脚本,从队列中提取消息并将其加载到ES中,如下所示: #! /usr/bin/ruby require 'bunny' require 'json' require 'elasticsearch' # Connect to RabbitMQ to collect data mq_co

堆垛机

我在RabbitMQ队列中有很多消息(在我的开发环境中的localhost上运行)。消息的有效负载是一个JSON字符串,我想直接加载到弹性搜索中(目前也在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
队列中大约有4000000条消息

当我运行脚本时,我看到一堆消息,比如说30条,被加载到弹性搜索中。但是,我看到大约500条消息离开队列

root@beep:~# rabbitmqctl list_queues
Listing queues ...
test.data    4333080
...done.
root@beep:~# rabbitmqctl list_queues
Listing queues ...
test.data    4332580
...done.
然后脚本悄悄退出,没有告诉我异常。begin/rescue块从不触发异常,因此我不知道为什么脚本会提前完成或丢失这么多消息。任何关于我接下来应该如何调试的线索


回答我自己的问题后,我了解到将索引指令的消息队列加载到Elastic中是一种疯狂而愚蠢的方式。我创建了一条河,并且可以比使用一个蹩脚的脚本更快地排出指令。;-)

我在这里添加了一个简单的工作示例:

当您不提供测试数据的示例时,很难调试您的示例

Elasticsearch“river”功能已被弃用,最终将被删除。如果RabbitMQ和Elasticsearch是您的基础架构的核心部分,那么您肯定应该投入时间来编写自己的定制feeder