Google Spanner Singleton переподключиться по вине - PullRequest
0 голосов
/ 09 февраля 2019

Я создаю SpannerSingleton, чтобы оставаться на связи в течение всей жизни приложения.Я заинтересован в долговечности соединения ... если есть проблема сеанса / соединения, как я могу воссоздать сеанс?

Одной из идей было создание нового соединения, увеличивая setMaxSessions до большего числа, если их больше 90% пула исчерпан.Как противоположность экспоненциального отката?Но где / как я могу это сделать?Я не смог найти в клиентской библиотеке ничего, что позволило бы мне отслеживать состояние пула или количество клиентов.

Я пошел с Билл-Пью-Синглтон Потому что это казалось хорошим выбором ...

Вот что у меня есть:

public class SpannerSingleton {

    private static Spanner spanner;
    private static SpannerOptions options;

    private static SessionPoolOptions sessionPoolOps = SessionPoolOptions
            .newBuilder()
            .setMaxSessions(1000)  // 1000 concurrent queries
            .setMinSessions(100)  // keep 100 alive
            .setMaxIdleSessions(100)  // how many to keep from being idle and closed
            .build(); 

    private SpannerSingleton() {
        try {
            options = SpannerOptions
                    .newBuilder()
                    .setSessionPoolOption(sessionPoolOps)
                    .build();

            spanner = options.getService();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class SingletonHelper{
        private static final Spanner CONNECTION = new SpannerSingleton().spanner;
    } 

    public static synchronized Spanner getSpanner() {
        return SingletonHelper.CONNECTION;
    }

}

Я использую шаблон Factory, чтобы сделать dbClient

public SpannerFactory {

    private static Spanner spanner = SpannerSingleton.getSpanner();
    private static DatabaseId dbId;

    public static DatabaseClient getConnection(String instance) {
        if (Util.isEmpty(instance)) return null;

        if ("mickey".equalsIgnoreCase(instance)) {
            dbId = DatabaseId.of(spanner.getOptions().getProjectId(), "instance1", "mickey");
        }

        if ("mouse".equalsIgnoreCase(instance)) {
            dbId = DatabaseId.of(spanner.getOptions().getProjectId(), "instance1", "mouse");
        }

        return spanner.getDatabaseClient(dbId);

    }
}

Я хотел бы добавить что-то, что проверит пул соединений, чтобы увидеть, насколько мы близки к истощению, и затем воссоздать себя ...может быть, из-за этого, но что может случиться, если соединение прервется?

1 Ответ

0 голосов
/ 11 февраля 2019

Клиентская библиотека должна заботиться о поддержании здорового пула сеансов, пользователю не нужно беспокоиться о сеансах / соединениях явно.

Как указано в java-клиенте, если вы установите MaxSessions правильно - клиент позаботится о поддержании этих многочисленных сессий.

На высоком уровне поток будет выглядеть следующим образом:

If currentSessions < MaxSessions {
   if !idleSessions.empty()
        use an idle session.
   else
        CreateNewSession.
} else {
   Block/Fail based on action chosen in : ActionOnExhaustion.
}

Если вы хотите избежать небольших накладных расходов в CreateSession как часть обработки запроса, один рекомендуемый вариантminSessions и maxSessions должны соответствовать вашим одновременным требованиям TPS , чтобы в начале у нас было много готовых к использованию сеансов.

Для получения дополнительной информации, такой как мониторинг сеансов, поддержание бездействующих сеансов: обратитесь к документации по адресу: https://cloud.google.com/spanner/docs/sessions

...