Skip to content

Commit b916fe2

Browse files
committed
add explain for Asynchronous inserts
1 parent ca3ce41 commit b916fe2

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

README.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,54 @@ If you wish to implement some retry logic atop of `clickhouse::Client` there are
139139
- For `clickhouse::Client::Insert()` you can reuse a block from previous try, no need to rebuild it from scratch.
140140

141141
See https://github.com/ClickHouse/clickhouse-cpp/issues/184 for details.
142+
143+
## Asynchronous inserts
144+
See https://clickhouse.com/docs/en/cloud/bestpractices/asynchronous-inserts for details.
145+
146+
⚠ The asynchronous setting is different according to the clickhouse-server version. The below example with clickhouse-server version 24.8.4.13. ⚠
147+
148+
> Our strong recommendation is to use async_insert=1,wait_for_async_insert=1 if using asynchronous inserts. Using wait_for_async_insert=0 is very risky because your INSERT client may not be aware if there are errors, and also can cause potential overload if your client continues to write quickly in a situation where the ClickHouse server needs to slow down the writes and create some backpressure in order to ensure reliability of the service.
149+
150+
- Only use the SDK, do not need to change the clickhouse-server config. Asynchronous inserts only work if the data is sent as SQL text format. Here is the example.
151+
```cpp
152+
// You can specify the asynchronous insert settings by using the SETTINGS clause of insert queries
153+
clickhouse::Query query("INSERT INTO default.test SETTINGS async_insert=1,wait_for_async_insert=1,async_insert_busy_timeout_ms=5000,async_insert_use_adaptive_busy_timeout=0,async_insert_max_data_size=104857600 VALUES(10,10)");
154+
client.Execute(query);
155+
156+
// Or by SetSetting
157+
clickhouse::Query query("INSERT INTO default.test VALUES(10,10)");
158+
query.SetSetting("async_insert", clickhouse::QuerySettingsField{ "1", 1 });
159+
query.SetSetting("wait_for_async_insert", clickhouse::QuerySettingsField{ "1", 1 }); // strong recommendation
160+
query.SetSetting("async_insert_busy_timeout_ms", clickhouse::QuerySettingsField{ "5000", 1 });
161+
query.SetSetting("async_insert_max_data_size", clickhouse::QuerySettingsField{ "104857600", 1 });
162+
query.SetSetting("async_insert_use_adaptive_busy_timeout", clickhouse::QuerySettingsField{ "0", 1 });
163+
client.Execute(query);
164+
165+
// Not available case. The Insert interface actually use the native data format
166+
clickhouse::Block block;
167+
client.Insert("default.test", block);
168+
```
169+
- Change the clickhouse-server users.xml, enable asynchronous inserts (available for the native data format). Here is the example.
170+
```xml
171+
<profiles>
172+
<!-- Default settings. -->
173+
<default>
174+
<async_insert>1</async_insert>
175+
<wait_for_async_insert>1</wait_for_async_insert>
176+
<async_insert_use_adaptive_busy_timeout>0</async_insert_use_adaptive_busy_timeout>
177+
<async_insert_busy_timeout_ms>5000</async_insert_busy_timeout_ms>
178+
<async_insert_max_data_size>104857600</async_insert_max_data_size>
179+
</default>
180+
181+
<!-- Profile that allows only read queries. -->
182+
<readonly>
183+
<readonly>1</readonly>
184+
</readonly>
185+
</profiles>
186+
```
187+
- Enabling asynchronous inserts at the user level. Ensure your login accout has the privileges about ALTER USER. Then you can use insert_account for asynchronous inserts.
188+
```sql
189+
ALTER USER insert_account SETTINGS async_insert=1,wait_for_async_insert=1,async_insert_use_adaptive_busy_timeout=0,async_insert_busy_timeout_ms=5000,async_insert_max_data_size=104857600
190+
```
191+
192+

0 commit comments

Comments
 (0)