повышение:: asio:: IP:: tcp:: сокет подключен?

Я создал базу знаний среднего размера (возможно, 2 ГБ индексируемого текста) сверху FTS 2005 SQL Server в 2006 и теперь переместил его в iFTS 2008. Обе ситуации работали хорошо на меня, но перемещение с 2005 до 2008 было на самом деле улучшением для меня.

Моя ситуация не была похожа на StackOverflow в том смысле, что я индексировал данные, которые были только обновлены ночью, однако я пытался присоединиться, результаты поиска от нескольких операторов CONTAINSTABLE въезжают задним ходом друг другу и к реляционным таблицам.

В FTS 2005, это означало, что каждый CONTAINSTABLE должен будет выполнить свой поиск на индексе, возвратиться, полные результаты и затем иметь механизм DB соединяют те результаты с реляционными таблицами (это было все очевидно для меня, но он происходил и был дорог к запросам). iFTS 2008 улучшил эту ситуацию, потому что интеграция базы данных позволяет нескольким результатам CONTAINSTABLE становиться частью плана запросов, который сделал много из поисков более эффективным.

я думаю, что и 2005 и механизмы FTS 2008, а также Lucene.NET, имеют архитектурные компромиссы, которые собираются выровняться лучше или хуже к большому количеству обстоятельств проекта - я просто стал удачливым, что обновление работало в мою пользу. Я могу полностью видеть, почему iFTS 2008 не работал бы в той же конфигурации 2005 для высоко природа OLTP варианта использования как StackOverflow.com. Однако я не обесценил бы возможность, что 2008 iFTS мог быть изолирован от тяжелой загрузки транзакции вставки..., но она также кажется, что это могло быть столько же работы для выполнения этого сколько перемещение на Lucene.NET..., и прохладный фактор Lucene.NET трудно проигнорировать ;)

Так или иначе, для меня, простота и эффективность iFTS 2008 SQL в большинстве ситуаций, вероятно, вычеркивают 'прохладный' фактор Lucene (хотя это просто в использовании, я никогда не использовал ее в производственной системе, таким образом, я резервирую комментарий к этому). Я был бы интересен в знании, сколько еще эффективный Lucene (оказался? это реализовано теперь?) в StackOverflow или аналогичных ситуациях.

18
задан coelhudo 24 July 2018 в 17:24
поделиться

3 ответа

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

На самом деле соединения - это просто виртуальные каналы, созданные с небольшим отслеживанием состояния в каждый конец соединения (исходный и целевой порты и адреса, а также локальный сокет). Сетевой стек использует это состояние, чтобы знать, какому процессу передать каждый входящий пакет и какое состояние поместить в заголовок каждого исходящего пакета.

Virtual TCP Conduit

Из-за лежащей в основе - по своей сути ненадежной и не имеющей установления соединения - природы сети, стек будет сообщать о разорванном соединении только тогда, когда удаленный конец отправляет пакет FIN, чтобы закрыть соединение, или если он этого не делает. t получить ответ ACK на отправленный пакет (после тайм-аута и пары повторных попыток).

Из-за асинхронного характера asio, самый простой способ получить уведомление о постепенном отключении - иметь невыполненный async_read , который вернет error :: eof сразу после закрытия соединения. Но это само по себе оставляет возможность других проблем, таких как полуоткрытые соединения и проблемы с сетью, которые останутся незамеченными.

Самый эффективный способ обойти неожиданное прерывание соединения - использовать своего рода keep-alive или ping. Эта случайная попытка передачи данных через соединение позволит оперативно обнаружить непреднамеренно разорванное соединение.

Протокол TCP фактически имеет встроенный механизм поддержания активности , который можно настроить в asio с помощью asio :: tcp: : socket :: keep_alive . Хорошая вещь в TCP keep-alive заключается в том, что он прозрачен для приложения пользовательского режима, и только одноранговые узлы, заинтересованные в keep-alive, должны настраивать его. Обратной стороной является то, что для настройки параметров тайм-аута вам потребуется доступ / знания на уровне ОС, к сожалению, они не отображаются через простой параметр сокета и обычно имеют довольно большие значения тайм-аута по умолчанию (7200 секунд в Linux).

Наиболее распространенный метод keep-alive - реализовать его на уровне приложения, где приложение имеет специальное сообщение noop или ping и ничего не делает, кроме как реагировать на щелчок. Этот метод дает вам максимальную гибкость при реализации стратегии поддержания активности.

и только одноранговые узлы, заинтересованные в сохранении активности, должны его настраивать. Обратной стороной является то, что для настройки параметров тайм-аута вам потребуется доступ / знания на уровне ОС, к сожалению, они не отображаются через простой параметр сокета и обычно имеют довольно большие значения тайм-аута по умолчанию (7200 секунд в Linux).

Наиболее распространенный метод keep-alive - реализовать его на уровне приложения, где приложение имеет специальное сообщение noop или ping и ничего не делает, кроме как реагировать на щелчок. Этот метод дает вам максимальную гибкость при реализации стратегии поддержания активности.

и только одноранговые узлы, заинтересованные в сохранении активности, должны его настраивать. Обратной стороной является то, что вам нужен доступ / знания на уровне ОС для настройки параметров тайм-аута, к сожалению, они не отображаются через простой параметр сокета и обычно имеют довольно большие значения тайм-аута по умолчанию (7200 секунд в Linux).

Наиболее распространенный метод keep-alive - реализовать его на уровне приложения, где приложение имеет специальное сообщение noop или ping и ничего не делает, кроме как реагировать на щелчок. Этот метод обеспечивает максимальную гибкость при реализации стратегии поддержания активности.

re, к сожалению, не предоставляется через простой параметр сокета и обычно имеет довольно большие значения тайм-аута по умолчанию (7200 секунд в Linux).

Вероятно, наиболее распространенный метод поддержания активности - это реализовать его на уровне приложения, где приложение имеет специальное сообщение noop или ping и ничего не делает, кроме как реагировать на щекотку. Этот метод дает вам максимальную гибкость при реализации стратегии поддержания активности.

re, к сожалению, не отображается через простой параметр сокета и обычно имеет довольно большие значения тайм-аута по умолчанию (7200 секунд в Linux).

Вероятно, наиболее распространенный метод поддержания активности - это реализовать его на уровне приложения, где приложение имеет специальное сообщение noop или ping и ничего не делает, кроме как реагировать на щекотку. Этот метод дает вам максимальную гибкость при реализации стратегии поддержания активности.

31
ответ дан 30 November 2019 в 07:50
поделиться

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

Если вы знать, какой протокол отправляется через TCP, то, вероятно, в этом протоколе есть способ сообщить вам, все ли в порядке (для HTTP это будет запрос HEAD )

1
ответ дан 30 November 2019 в 07:50
поделиться

you can send a dummy byte on a socket and see if it will return an error.

-1
ответ дан 30 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: