|
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