Управление сессиями в Thrift

Кажется, я не могу найти никакой документации о том, как должно осуществляться управление сеансами в рамках Thrift RPC.

Я знаю, что могу сделать

TServer.setServerEventHandler(myEventHandler);

и наблюдайте за вызовами createContext (вызывается при установлении соединения) и processContext (вызывается перед каждым вызовом метода). Тем не менее, я должен получить любое состояние сеанса, которое я поддерживаю в этом сообщении, в сам обработчик.

Итак, как я могу получить доступ к информации о сеансе в моих обработчиках?


person Evgeniy Berezovsky    schedule 28.03.2014    source источник
comment
@JensG ответил в одном из ответов, что это невозможно сделать прямо сейчас. Я думаю, что ключом здесь является THttpClient, который может сохранять данные заголовков. Осталось создать сервер. Я надеялся создать http-сервер, используя бережливость, но не могу найти примеры/информацию для этого.   -  person AlikElzin-kilaka    schedule 03.02.2015


Ответы (2)


Не уверен, что нет способа использовать подход ServerEventHandler, упомянутый в моем вопросе, но вот как мне удалось создать один обработчик для каждого соединения.

Вместо того, чтобы один раз предоставлять экземпляр одноэлементного процессора, содержащий экземпляр обработчика, например:

XProcessor<XHandler> processor = new X.Processor<XHandler>(new XHandler());
TServer server = new TSimpleServer(new TServer.Args(serverTransport)
    .processor(processor));

Вместо этого я создаю и предоставляю TProcessorFactory:

TProcessorFactory processorFactory = new TProcessorFactory(null)
{
    public TProcessor getProcessor(TTransport trans)
    {
        return new X.Processor<XHandler>(new XHandler());
    }
};
TServer server = new TSimpleServer(new TServer.Args(serverTransport)
    .processorFactory(processorFactory));
person Evgeniy Berezovsky    schedule 28.03.2014
comment
Я не понимаю. Как клиент устанавливает сеанс на сервере? - person AlikElzin-kilaka; 08.01.2015
comment
@AlikElzin-kilaka Клиент просто подключается. Во время подключения сервер создает новый экземпляр XHandler. Этот экземпляр XHandler привязан к этому единственному соединению, это является сеансом. Клиенту не нужно ничего устанавливать. Пока соединение живо, этот сеанс тоже жив. Отключение убьет сеанс. Этого недостаточно, если вам нужны ваши сеансы, чтобы выжить при отключении. И я не уверен, как это работает, если вы используете HTTP-транспорт. - person Evgeniy Berezovsky; 09.01.2015
comment
Для простоты поговорим о java-клиенте. Как вы устанавливаете sessionid/auth-token на стороне клиента, чтобы сервер мог его прочитать? - person AlikElzin-kilaka; 09.01.2015

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

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

Я бы рекомендовал включать идентификатор сеанса (или любой аналог, который вы используете) в каждый вызов. Вот как мы это делаем, и это работает довольно хорошо.

Несмотря на то, что модель «один обработчик на соединение» довольно удобна, она не очень масштабируется по дизайну (то же самое верно и для «поточных» серверов, кстати). Представьте себе, что любое количество подключений, кратное вашему выбору, равно 1000, параллельно забивает ваш сервис. Если есть хоть малейший шанс, что этот сценарий станет реальностью, вам следует подумать о другом решении, потому что, скорее всего, подход, который вы собираетесь использовать, не будет масштабироваться.

На самом деле, есть некоторые планы по интеграции данных типа «заголовок», но этого пока нет в кодовой базе Apache Thrift.

person JensG    schedule 28.03.2014
comment
Да, добавление еще одного параметра к каждому методу (заинтересованному в данных сеанса) было бы несколько громоздким способом, не связанным с АОП. Я пытался избежать шаблонности. У вас есть ссылка на данные заголовков, которые вы упомянули? - person Evgeniy Berezovsky; 01.04.2014
comment
Вот Билет Header. Под АОП вы подразумеваете аспектно-ориентированный? Где я могу найти это в документах Thrift? ;-) - person JensG; 01.04.2014
comment
Аспектно-ориентированный, это правильно. Я не говорю о концепции, не о структуре АОП. Я не хочу распространяться об этом аспекте, а именно о предоставлении идентификатора сеанса при каждом вызове для каждого метода. - person Evgeniy Berezovsky; 02.04.2014
comment
Спасибо, JensG, билет не раскрывает многого, но ключевое слово THeader привело к высокоуровневое описание, и оттуда оставался всего один шаг до fbthrift, который я проверю. - person Evgeniy Berezovsky; 02.04.2014
comment
Что ж, это так. Мы находимся в процессе слияния изменений fbthrift с Apache Thrift, отсюда и билеты. Что касается АОП: вы не можете заставить какой-либо компонент (включая Thrift, но не ограничиваясь этим) нести ответственность за то, что он не является АОП, если это не было целью разработки. Если вы хотите заниматься АОП, это ваш выбор. - person JensG; 02.04.2014
comment
Я не верю, что в Thrift до сих пор нет механизма, подобного заголовку :( - person AlikElzin-kilaka; 02.02.2015
comment
@AlikElzin-kilaka: Пока нет, но есть движение. И вера не продвигает нас вперед. В конце концов, Thrift — это Open Source, поэтому варианты такие: 1) наберитесь терпения и пассивно ждите, полагаясь на других 2) вносите активный вклад, продвигайте его и делайте это быстрее 3) Обойти проблему другим способом. Очевидно, что любой из этих вариантов имеет свои преимущества и недостатки. Выбор за вами. - person JensG; 02.02.2015