Проблема задержки извлечения сообщения в пабе Google Pub. С клиентом.Net

Я постоянно получаю сообщения из Google PubSub. Все идет хорошо, за исключением того, что время, необходимое для получения сообщения, составляет от 12 до 15 секунд, и в нашем случае это неприемлемо. Ниже приведены мои настройки CallTiming:

 public CallSettings GetPullSetting()
    {
        CallTiming timing = CallTiming.FromRetry(new RetrySettings(
                retryBackoff: new BackoffSettings(new TimeSpan(0, 0, 0, 0, 50), new TimeSpan(0, 0, 5), 1),
                timeoutBackoff: new BackoffSettings(new TimeSpan(0, 0, 0, 18, 0), new TimeSpan(0, 0, 20), 1),
                totalExpiration: Google.Api.Gax.Expiration.FromTimeout(TimeSpan.FromMilliseconds(600000))));

        return CallSettings.FromCallTiming(timing);
    }

Я пробовал все виды комбинаций, чтобы уменьшить эту задержку до максимум 3 секунд.

Одним из наблюдений является то, что всякий раз, когда сообщение извлекается успешно, и на самой следующей итерации pull если на pubsub есть сообщение, оно немедленно получает это сообщение. Это означает, что если сообщение найдено в последовательном pull задержка очень низкая.

Но проблема, скажем, за одну итерацию я получаю Deadline exceeded исключение, так как pubsub не имеет сообщения. Затем я отправляю сообщение в pubsub для следующей итерации. На данный момент это занимает много времени (от 13 до 16 секунд). Таким образом, условие для воспроизведения этой проблемы - у меня будет одна неудачная попытка вытащить сообщение.

Код вставлен здесь:

public void PullTest()
        {
            var cont = true;
            SubscriberSettings settings = new SubscriberSettings()
            {
                PullSettings = GetPullSetting()
            };
            SubscriberClient subscriberClient = SubscriberClient.Create(settings: settings);
            var subscriberName = new SubscriptionName("project-name", "subscription-name");
            while (cont)
            {
                try
                {
                    PullResponse response = subscriberClient.Pull(subscriberName, returnImmediately: false, maxMessages: 1);
                    System.Diagnostics.Trace.WriteLine(">>>>>> " + DateTime.Now.ToString());
                    System.Diagnostics.Trace.WriteLine(">>>>>> " + "Job Recieved" + response.ReceivedMessages.ToList().FirstOrDefault());
                    subscriberClient.Acknowledge(subscriberName, new List<string>() { response.ReceivedMessages.ToList().FirstOrDefault().AckId });
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Trace.WriteLine(">>>>>> " + DateTime.Now.ToString());
                    System.Diagnostics.Trace.WriteLine(">>>>>> " + ex.Message);
                }
            }
        }

 public CallSettings GetPullSetting()
        {
            CallTiming timing = CallTiming.FromRetry(new RetrySettings(
                    retryBackoff: new BackoffSettings(new TimeSpan(0, 0, 0, 0, 50), new TimeSpan(0, 0, 5), 1),
                    timeoutBackoff: new BackoffSettings(new TimeSpan(0, 0, 0, 18, 0), new TimeSpan(0, 0, 20), 1),
                    totalExpiration: Google.Api.Gax.Expiration.FromTimeout(TimeSpan.FromMilliseconds(600000))));

            return CallSettings.FromCallTiming(timing);
        }

2 ответа

Решение

У вас есть проблема с откатом между последовательными вытягиваниями, когда истекает срок ожидания. По сути, вы ищете длинное решение для опроса, для которого вам нужно либо сократить время отката до нуля, либо использовать пользовательское соединение / клиент для повторной попытки без задержки.

Чтобы свести к минимуму задержку, вам нужно одновременно обрабатывать несколько запросов на получение. В зависимости от ваших требований к пропускной способности, могут потребоваться десятки ожидающих запросов одновременно. Если ваша пропускная способность низкая, вы все равно захотите иметь несколько запросов на получение сразу (по крайней мере, два или три). Как только кто-нибудь из них вернется, будь то с превышением установленного срока или с сообщением, запустите еще один запрос на извлечение. Цель состоит в том, чтобы всегда получать ожидающие запросы, ожидающие получения сообщений, которые были опубликованы.

Другие вопросы по тегам