Ruby Google Cloud PubSub异步请求返回GRPC :: DeadlineExceeded错误

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res