代码之家  ›  专栏  ›  技术社区  ›  Ceilingfish

增加Google PubSub的截止时间超时

  •  2
  • Ceilingfish  · 技术社区  · 7 年前

    在使用C#库向Google PubSub主题发布消息时,我们会间歇性地遇到以下错误:

    Exception: Grpc.Core.RpcException: Status(StatusCode=Unauthenticated, Detail="Deadline Exceeded")
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Google.Api.Gax.Grpc.ApiCallRetryExtensions.<>c__DisplayClass0_0`2.<<WithRetry>b__0>d.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Google.Cloud.PubSub.V1.Tasks.ForwardingAwaiter`1.GetResult()
       at Google.Cloud.PubSub.V1.Tasks.Extensions.<>c__DisplayClass6_0`1.<<ConfigureAwaitHideErrors>g__Inner0>d.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Google.Cloud.PubSub.V1.Tasks.ForwardingAwaiter`1.GetResult()
       at Google.Cloud.PubSub.V1.SimplePublisherImpl.<PublishAsync>d__26.MoveNext()
       at Google.Api.Gax.Grpc.ApiCallRetryExtensions.<>c__DisplayClass0_0`2.<<WithRetry>b__0>d.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    

    谷歌告诉我这是一个可配置的超时。我们正在这样配置客户端库:

    private SimplePublisher CreateSimplePublisher(int maxItems, int maxSizeBytes, TimeSpan maxDelay)
    {
        var credential = Credential.IsCreateScopedRequired ?
            Credential.CreateScoped(PublisherClient.DefaultScopes) : Credential;
        var channel = new Channel(
            PublisherClient.DefaultEndpoint.Host,
            PublisherClient.DefaultEndpoint.Port,
            credential.ToChannelCredentials());
        var publisherClient = PublisherClient.Create(channel);
        return SimplePublisher.Create(
            new TopicName(Project, Topic),
            new[] { publisherClient },
            new SimplePublisher.Settings
            {
                BatchingSettings = new BatchingSettings
                (
                    elementCountThreshold: maxItems,
                    byteCountThreshold: maxSizeBytes,
                    delayThreshold: maxDelay
                )
            });
    }
    

    是否有人知道如何在此配置中配置截止日期阈值?这正在使用版本 1.0.0-beta13 Google.Cloud.PubSub.V1 客户端库nuget包。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ceilingfish    7 年前

    这似乎是通过传递 PublisherSettings 对象到 PublisherClient.Create 呼叫

    private SimplePublisher CreateSimplePublisher(int maxItems, int maxSizeBytes, TimeSpan maxDelay)
    {
        var credential = Credential.IsCreateScopedRequired ?
            Credential.CreateScoped(PublisherClient.DefaultScopes) : Credential;
        var channel = new Channel(
            PublisherClient.DefaultEndpoint.Host,
            PublisherClient.DefaultEndpoint.Port,
            credential.ToChannelCredentials());
        //Add a specific timeout for the publish operation
        var publisherClientSettings = new PublisherSettings
        {
            PublishSettings = CallSettings.FromCallTiming(CallTiming.FromTimeout(TimeSpan.FromMinutes(60)))
        };
        var publisherClient = PublisherClient.Create(channel,publisherClientSettings);
        return SimplePublisher.Create(
            new TopicName(Project, Topic),
            new[] { publisherClient },
            new SimplePublisher.Settings
            {
                BatchingSettings = new BatchingSettings
                (
                    elementCountThreshold: maxItems,
                    byteCountThreshold: maxSizeBytes,
                    delayThreshold: maxDelay
                )
            });
    }