如何解决Ruby Google Cloud PubSub异步请求返回GRPC :: DeadlineExceeded错误
嗨,我在Google PubSub中设置了一个订阅,我正尝试使用“官方” google-cloud-ruby 库异步提取消息。这是我的代码,将从subscription_name
中传递的rake任务中执行:
def pull!
creds = Google::Cloud::PubSub::Credentials.new(
GCP_CREDENTIALS_KEYFILE_PATH,scope: "https://www.googleapis.com/auth/pubsub"
)
messages = []
pubsub = Google::Cloud::PubSub.new(
project_id: GOOGLE_PROJECT_ID,credentials: creds
)
subscription = pubsub.subscription(subscription_name)
subscription.pull(immediate: true).each do |received_message|
puts "Received message: #{received_message.data}"
received_message.acknowledge!
messages.push(received_message)
end
# Return the collected messages
messages
rescue => error
Rails.logger error
messages.presence
end
Google::Cloud::PubSub::Credentials
部分引用了有效的密钥文件。我知道JSON密钥文件是很好的,因为我可以使用oauth2l
来使用它来生成有效的Bearer令牌,并使用cURL,邮递员,Net :: HTTP等从PubSub中提取。使用相同的JSON凭证来创建单独的{ {1}}服务,效果也很好。
但是由于某些原因,使用Google::Cloud::Storage
只会挂起并且不会响应。大约60秒后,出现以下错误:
Google::Cloud::PubSub
添加调试器会显示以下行挂起并导致错误:
GRPC::DeadlineExceeded: 4:Deadline Exceeded. debug_error_string:{"created":"@1602610740.445195000","description":"Deadline Exceeded","file":"src/core/ext/filters/deadline/deadline_filter.cc","file_line":69,"grpc_status":4}
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/grpc-1.32.0-universal-darwin/src/ruby/lib/grpc/generic/active_call.rb:29:in `check_status'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/grpc-1.32.0-universal-darwin/src/ruby/lib/grpc/generic/active_call.rb:180:in `attach_status_results_and_complete_call'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/grpc-1.32.0-universal-darwin/src/ruby/lib/grpc/generic/active_call.rb:376:in `request_response'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/grpc-1.32.0-universal-darwin/src/ruby/lib/grpc/generic/client_stub.rb:172:in `block (2 levels) in request_response'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/grpc-1.32.0-universal-darwin/src/ruby/lib/grpc/generic/interceptors.rb:170:in `intercept!'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/grpc-1.32.0-universal-darwin/src/ruby/lib/grpc/generic/client_stub.rb:171:in `block in request_response'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/gapic-common-0.3.4/lib/gapic/grpc/service_stub/rpc_call.rb:121:in `call'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/gapic-common-0.3.4/lib/gapic/grpc/service_stub.rb:156:in `call_rpc'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/google-cloud-pubsub-v1-0.1.2/lib/google/cloud/pubsub/v1/subscriber/client.rb:503:in `get_subscription'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/google-cloud-pubsub-2.1.0/lib/google/cloud/pubsub/service.rb:154:in `get_subscription'
/Users/bbulpet/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/google-cloud-pubsub-2.1.0/lib/google/cloud/pubsub/project.rb:286:in `subscription'
我已经根据documentation尝试了所有可以想到的方法。更新了所有相关的gem,甚至出于绝望而尝试使用不推荐使用的语法。如果有人至少知道从哪里开始,那将不胜感激!
更新
因此,由于某种原因,无法在本地运行此命令,但将其发送到已部署的环境后,以上代码可以完美地连接到pubsub并能够提取和确认消息。此外,在已部署的环境中进行初始连接后,我现在也可以使用相同的凭据在本地连接。
Link to Github issue对话,以获取有关故障排除过程的上下文以及对尝试部署到其他环境的石英建议。
解决方法
您还有这个问题吗?我只是尝试使用Ruby 2.6.5p114,google-cloud-pubsub 2.1.0和grpc 1.32.0(与您使用的版本相同)进行复制,但是我无法对其进行复制。这是我的代码(经过稍微修改以在Minitest规范上下文中运行)以进行比较:
GCP_CREDENTIALS_KEYFILE_PATH = "/Users/quartzmo/my-project.json"
GOOGLE_PROJECT_ID = "my-project-id"
def pull! topic_name,subscription_name
creds = Google::Cloud::PubSub::Credentials.new(
GCP_CREDENTIALS_KEYFILE_PATH,scope: "https://www.googleapis.com/auth/pubsub"
)
messages = []
pubsub = Google::Cloud::PubSub.new(
project_id: GOOGLE_PROJECT_ID,credentials: creds
)
topic = pubsub.create_topic topic_name
topic.subscribe subscription_name
topic.publish "A test message from #{topic_name} to #{subscription_name}"
subscription = pubsub.subscription(subscription_name)
subscription.pull(immediate: true).each do |received_message|
puts "Received message: #{received_message.data}"
received_message.acknowledge!
messages.push(received_message)
end
# Return the collected messages
messages
end
focus
it "pull!" do
topic_name = random_topic_name
subscription_name = random_subscription_name
messages = pull! topic_name,subscription_name
assert_equal 1,messages.count
assert_equal "A test message from #{topic_name} to #{subscription_name}",messages[0].data
end
这是输出:
% bundle exec rake test
Run options: --junit --junit-filename=sponge_log.xml --seed 30984
# Running:
Received message: A test message from ruby-pubsub-samples-test-topic-7cb10bde to ruby-pubsub-samples-test-subscription-f47f2eaa
.
Finished in 6.529219s,0.1532 runs/s,0.3063 assertions/s.
1 runs,2 assertions,0 failures,0 errors,0 skips
更新(2020-10-20):在未知环境中执行代码时,此问题已解决。参见comment on GitHub issue。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。