|
1194 | 1194 |
|
1195 | 1195 | - C++
|
1196 | 1196 |
|
1197 |
| - Работа пользователя с объектом `IReadSession` в общем устроена как обработка цикла событий со следующими типами событий: `TDataReceivedEvent`, `TCommitOffsetAcknowledgementEvent`, `TStartPartitionSessionEvent`, `TStopPartitionSessionEvent`, `TPartitionSessionStatusEvent`, `TPartitionSessionClosedEvent` и `TSessionClosedEvent`. |
| 1197 | + Работа пользователя с объектом `IReadSession` в общем устроена как обработка цикла событий со следующими типами событий: `TDataReceivedEvent`, `TCommitOffsetAcknowledgementEvent`, `TStartPartitionSessionEvent`, `TEndPartitionSessionEvent`, `TStopPartitionSessionEvent`, `TPartitionSessionStatusEvent`, `TPartitionSessionClosedEvent` и `TSessionClosedEvent`. |
1198 | 1198 |
|
1199 | 1199 | Для каждого из типов событий можно установить обработчик этого события, а также можно установить общий обработчик. Обработчики устанавливаются в настройках сессии записи перед её созданием.
|
1200 | 1200 |
|
|
1873 | 1873 | ```
|
1874 | 1874 |
|
1875 | 1875 | {% endlist %}
|
| 1876 | +
|
| 1877 | +### Поддержка автомасштабирования топиков {#autoscaling} |
| 1878 | +
|
| 1879 | +{% list tabs %} |
| 1880 | +
|
| 1881 | +- C++ |
| 1882 | +
|
| 1883 | + SDK поддерживает два режима чтения топиков с включенным автомасштабированием: режим полной поддержки и режим совместимости. Режим чтения задается в параметрах создания сессии чтения. По умолчанию используется режим совместимости. |
| 1884 | +
|
| 1885 | + ```cpp |
| 1886 | + auto settings = TReadSessionSettings() |
| 1887 | + .SetAutoscalingSupport(true); // full support is enabled |
| 1888 | +
|
| 1889 | + // or |
| 1890 | +
|
| 1891 | + auto settings = TReadSessionSettings() |
| 1892 | + .SetAutoscalingSupport(false); // compatibility mode is enabled |
| 1893 | +
|
| 1894 | + auto readSession = topicClient.CreateReadSession(settings); |
| 1895 | + ``` |
| 1896 | +
|
| 1897 | + В режиме полной поддержки, когда все сообщения из партиции будут прочитаны, будет приходить событие `TEndPartitionSessionEvent`. После получения этого события в партиции не появится новых сообщений для чтения. Для того, что бы продолжить чтение из дочерних партиций, необходимо вызвать `Confirm()`, тем самым подтвердив, что приложение готово принимать сообщения из дочерних партиций. Если сообщения из всех партиций обрабатываются в одном потоке, то `Confirm()` можно вызвать сразу как получили `TEndPartitionSessionEvent`. Если обработка сообщений из разных партиций обрабатывается в разных потоках, то следует закончить обрабатывать сообщения, например, выполнить накопившийся батч, подтвердить их обработку (коммит) или сохранить позицию чтения в своей базе, и только после этого позвать `Confirm()`. |
| 1898 | +
|
| 1899 | +После получения `TEndPartitionSessionEvent` и обработки всех сообщений рекомендуется всегда сразу подтверждать обработку сообщений (коммит). Это позволит балансировать чтение дочерних партиции по разным сессиям чтения, что приведет к равномерному распределению нагрузки по всем читателям. |
| 1900 | +
|
| 1901 | + Фрагмент цикла событий может выглядеть так: |
| 1902 | +
|
| 1903 | + ```cpp |
| 1904 | + auto settings = TReadSessionSettings() |
| 1905 | + .SetAutoscalingSupport(true); |
| 1906 | +
|
| 1907 | + auto readSession = topicClient.CreateReadSession(settings); |
| 1908 | +
|
| 1909 | + auto event = readSession->GetEvent(/*block=*/true); |
| 1910 | + if (auto* endPartitionSessionEvent = std::get_if<TReadSessionEvent::TEndPartitionSessionEvent>(&*event)) { |
| 1911 | + endPartitionSessionEvent->Confirm(); |
| 1912 | + } else { |
| 1913 | + // other event types |
| 1914 | + } |
| 1915 | + ``` |
| 1916 | +
|
| 1917 | + В режиме совместимости нет явного сигнала о завершении чтения из партиции и сервер попытается эвристически определить, что клиент обработал партицию до конца. В результате этого может возникнуть задержка между окончанием чтения из партиции и началом чтения из дочерних партиций. |
| 1918 | +
|
| 1919 | + Если клиент подтверждает обработку сообщений (коммит), то сигналом завершения обработки сообщений из партиции будет подтверждени обработки последнего сообщения этой партиции. Если же клиент не подтверждает обработку сообщений, то сервер будет периодически прерывать чтение из партиции, и начинать чтение в другой сессии чтения (если есть другие сессии чтения готовые обрабатывать партицию). И так до тех пор, пока чтение не [начнется](#client-commit) с конца партиции. |
| 1920 | +
|
| 1921 | + Рекомендуется проверять правильность обработки мягкого прерывании чтения: клиент должен обработать полученные сообщения, подтвердить обработку сообщений (коммит) или сохранить позицию чтения в своей базе, и только после этого вызывать `Confirm()` у `TStopPartitionSessionEvent`. |
| 1922 | +
|
| 1923 | +{% endlist %} |
0 commit comments