首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google Pub/Sub消息花了5分钟才发布。为什么会这样呢?

Google Pub/Sub消息花了5分钟才发布。为什么会这样呢?
EN

Stack Overflow用户
提问于 2021-03-20 12:55:27
回答 1查看 408关注 0票数 1

我有一个云函数,它发布一个Cloud /Sub消息。但是,这个测试消息需要5分钟才能被测试订阅发布和使用。

这是正常的时机吗?实际上,我以为它会更快一些,比方说,反应更快。当我的Auth0钩子(注册后)触发云函数端点时,我想在数据库中初始化一个用户。

最好的情况下,用户输入应该发生在用户访问网站注册后,因此速度是至关重要的。

以下是函数代码(Java):

代码语言:javascript
复制
public class UserInit implements HttpFunction {
  @Override
  public void service(HttpRequest request, HttpResponse response) throws Exception {
    String projectId = "app-platform";
    String topicId = "user-init";
    final TopicName topicName = TopicName.of(projectId, topicId);
    final Publisher publisher = Publisher.newBuilder(topicName).build();
    System.out.println("project: " + projectId);
    System.out.println("topic: " + topicId);
    final PubsubMessage message = PubsubMessage.newBuilder()
        .putAttributes("test", "test")
        .build();
    final ApiFuture<String> messageIdFuture = publisher.publish(message);
    ApiFutures.addCallback(messageIdFuture, new ApiFutureCallback<String>() {
      public void onSuccess(String messageId) {
        System.out.println("published with message id: " + messageId);
      }

      public void onFailure(Throwable t) {
        System.out.println("failed to publish: " + t);
      }
    }, MoreExecutors.directExecutor());
  }
}

以下是相关日志:

代码语言:javascript
复制
2021-03-20T12:29:47.486387599Zuser-initlo8xln5ztgq3 Function execution started
2021-03-20T12:29:57.947Zuser-initlo8xln5ztgq3 project: app-platform
2021-03-20T12:29:57.949Zuser-initlo8xln5ztgq3 topic: user-init
2021-03-20T12:29:59.551220278Zuser-initlo8xln5ztgq3 Function execution took 12065 ms, finished with status code: 200
2021-03-20T12:35:13.145Zuser-initlo8xln5ztgq3 published with message id: 2139319306781573

第一件事是Function execution took 12065 ms,这让我很惊讶。函数执行时间为12秒。那是相当长的一段时间。然而,真正烦人的是函数执行和Pub/Sub回调之间的时间

代码语言:javascript
复制
2021-03-20T12:29:59 // execution
2021-03-20T12:35:13 // callback print message

这是~5分钟过去了。我可以通过Pub/Sub监控和我的测试订阅来确认这一点,在我预期消息已经发布之后,我在那里执行了几次“拉”。在任何情况下,我都可以确认从函数执行到发布/子消息的发现所花费的时间与前面提到的一样,大约5分钟。

因此,我想知道这是预期的行为,我只是惊讶,因为我第一次使用Pub/Sub,还是我说得对吗?

这里也是我的cloudbuild.yaml设置,因此我的函数的配置:

代码语言:javascript
复制
steps:
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    args:
      - gcloud
      - functions
      - deploy
      - user-init
      - --runtime=java11
      - --region=europe-west3
      - --source=./user-init
      - --entry-point=com.app.functions.UserInit
      - --allow-unauthenticated
      - --trigger-http
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    args:
      - gcloud
      - alpha
      - functions
      - add-iam-policy-binding
      - user-init
      - --region=europe-west3
      - --member=allUsers
      - --role=roles/cloudfunctions.invoker

编辑1

.wait()调用之后,我尝试使用publish()等待并发任务。

相关的更改如下:

代码语言:javascript
复制
    final Publisher publisher = Publisher.newBuilder(topicName)
        .setBatchingSettings(Publisher.Builder.getDefaultBatchingSettings())
        .build();
    final PubsubMessage message = PubsubMessage.newBuilder()
        .putAttributes("test", "test")
        .build();
    publisher.publish(message).wait();

然而,这些错误是由于使用wait()而产生的。

代码语言:javascript
复制
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at java.base/java.lang.Thread.run(Thread.java:834)
at com.google.cloud.functions.invoker.runner.Invoker$NotFoundHandler.handle(Invoker.java:392)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:500)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:135)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938)
EN

回答 1

Stack Overflow用户

发布于 2021-03-20 19:46:22

云函数实际上是在12 s中执行的,并回复了HTTP 200代码。然后CPU就会受到限制,因为除了请求处理之外,云功能不需要CPU。

云功能所允许的CPU不到5%,很少,用这么少的CPU执行回调需要时间。

实际上,在等待有效消息发布之前,您将响应HTTP 200。在函数的末尾添加这一行

代码语言:javascript
复制
messageIdFuture.wait();

等待并发线程的结束。你会看到它会更有效率!

您还需要知道云函数的性能(从而定价)取决于内存的数量。。默认情况下,您有256 of的内存-> 400 12s的计算处理:启动云函数+ JVM时只需400 12s,单核CPU,确实需要时间(12s)。而且你也可以理解,5%的那处理回调,可以花几分钟!

因此,增加云函数内存以提高云函数的性能

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66721853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档