The content of this page has been automatically translated by AI. If you encounter any problems while reading, you can view the corresponding content in Chinese.

Database Use

Last updated: 2024-10-15 17:53:24

How should I get the definition of the error codes in a response packet?

We recommend that you call functions TcapErrCode::TcapErrCodeInit and TcapErrCode::GetErrStr in the game server to get error codes, or you can search locally for the TcaplusDB API header files.

How does TcaplusDB's optimistic locking work and how to use it?

Let's use the purchase of train tickets as an example:
1. 100 people want to snap up the same train ticket. The recorded version number of the train ticket is 10, and the 100 people use the same recorded version number to snap up the train ticket.
2. 100 people conduct write operations to this ticket. After the write operation is completed, the recorded version number will increase. Therefore, for the operation of a single key, the tcapsvr worker threads are queued. When the first person successfully purchased the ticket, the recorded version number of the train ticket changed to 11, and the recorded version number of the remaining 99 people is still 10.
3. When tcapsvr handles the write requests of the 99 people, an error will occur because the recorded version number at tcapsvr end is inconsistent with the version number in the request. The concurrent principles are as follows:
N requests. If only the first request succeeds and the remaining N-1 requests fail, the version protection rules are used.
N requests. If all N requests are required to be executed, no version protection rules are required. TcaplusDB operates on the same key.
Queue execution calls the function SetCheckDataVersionPolicy, which includes values:
CHECKDATAVERSION_AUTOINCREASE: Checks the record version number. The version number will auto-increase only when it matches the server's version number.
NOCHECKDATAVERSION_OVERWRITE: Does not check the record version number. It forces the client’s record version number to be written to the server.
NOCHECKDATAVERSION_AUTOINCREASE: Does not check the record version number. It auto-increases the server's version number.
The default type is CHECKDATAVERSION_AUTOINCREASE, which is recommended for use.

What are the use cases and precautions for the LIST table?

Where there is a 1:N usage scenario, when N < 1024, the list table is prioritized, such as storing the player's most recent 100 emails, the most recent 100 battle records, and so on. The list table supports insertion at the head of the queue and removal at the end of the queue, insertion at the end of the queue and removal at the head of the queue, as well as the Top N operations sorted by insertion time. The number of units under a single key can be increased by modifying the table, because the old data needs to be compatible and cannot be modified to become smaller. You can obtain the total number of records under a single key by using listgetall. It is recommended to obtain data according to the offset and limit of a certain threshold that you set. For listreplace, listdelete, and listdeletebatch, you need to specify the correct index. For listaddafter, you need to specify the elimination rule when the number of element units under a single key reaches the upper limit. Since the SetListShiftFlag function settings are called, the list table has two increasing and two obtaining directions. There are 4 possibilities:
1. Query A, B, C, D, E as offset = positive number and limit = 2, and the result is A, B; C, D; E.
2. Query A, B, C, D, E as offset = negative number and limit = 2, and the result is D, E; B, C; A.
3. Query E, D, C, B, A as offset = positive number and limit = 2, and the result is E, D; C, B; A.
4. Query E, D, C, B, A as offset = negative number and limit = 2, and the result is B, A; D, C; E.
Additionally, calling GetRecordMatchCount can retrieve the total number of records.

What is the difference between INSERT, UPDATE and REPLACE?

For INSERT operation, when the key does not exist, an INSERT operation is performed; when the key exists, an error code is returned: TcapErrCode::SVR_ERR_FAIL_RECORD_EXIST. For REPLACE operation, when the key does not exist, an INSERT operation is performed; when the key exists, if the optimistic lock is used, different operations are performed based on the result of the optimistic lock. If the operation is successful, the REPLACE operation is performed, and if it fails, an error code is returned: TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION; If optimistic locking is not used, the REPLACE operation is performed. For UPDATE operation, when the key exists, if the optimistic lock is used, different operations are performed based on the result of the optimistic lock. If the operation is successful, the UPDATE operation is performed, and if it fails, an error code is returned: TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION, If optimistic locking is not used, the UPDATE operation is performed. When the key does not exist, an error code is returned: TcapErrCode::TXHDB_ERR_RECORD_NOT_EXIST.

How do I get the number of records in a table?

There is a count command word in the TcaplusDB API. If tcaplus_client is used, you can use the count table name command to get the number of records in the table.

Does TcaplusDB support traversal operations?

TcaplusDB supports traversal operations, including traversal operations for GENERIC and LIST tables. You can use the SetOnlyReadFromSlave(bool flag) API to traverse the data from the secondary tcapsvr, which will not affect the services provided by the primary tcapsvr.

Does TcaplusDB support updating and obtaining partial fields?

TcaplusDB supports partial field updates. When updating and obtaining records, it is recommended to explicitly call API SetFieldNames(IN const char* field_name[], IN const unsigned field_count) to determine the fields of this read and write operation, and reduce the network traffic overhead caused by invalid fields.

Is TcaplusDB order-preserving for the continuous operations of a single primary key?

For the same game server, the operations of the same primary key are order-preserving, while the operations of different primary keys are not order-preserving. For different game servers, the order is not preserved.

Does TcaplusDB support table definition changes?

TcaplusDB supports table definition changes. If you simply add common fields and modify macros, use table change operations; for the rest of the scenarios, you need to dynamically modify the table structure. That is, use the data migration + log flow process to achieve table definition changes. Please submit a ticket and select "Other Tencent Cloud Products" to apply.

How do I know whether the packeting of response packet has ended?

For traversal, judge whether the traversal ends according to state, that is, API GetState. For the rest of the packeting scenarios, judge whether the packeting ends according to the function HaveMoreResPkgs.

What is the difference between GetRecordCount and GetRecordMatchCount?

A request may have N response packets. If there are multiple packets, GetRecordCount refers to the number of records in the response packet, and GetRecordMatchCount refers to the data records stored on the tcapsvr (storage layer) end (total number of records for a single key).

Does TcaplusDB have a pass-through field?

The CS protocol of TcaplusDB is divided into two parts: Head and Body. UserBuff (maximum size is 1 KB), AsyncID and Sequence in Head are all pass through fields. You can use them accordingly.

What is the role of SetResultFlag?

When performing write operations, the response packet supports returning records. When performing read operations, calling this function is invalid. The description of the specific value of result_flag is as follows: 0 refers to: Simply return whether the operation is successful or not without returning the value field. 1 refers to: Return data consistent with the request field. 2 refers to: The latest data for all fields of the change record must be returned. 3 refers to: The old data for all fields of the change record must be returned.
The SetResultFlagForSuccess API can set the data returned if the operation succeeded; the SetResultFlagForFail API can set the data returned if the operation failed.

Can I perform increase operations on multiple non-primary key fields at a time? What if the primary key does not exist?

The increase operation can increase multiple common fields at a time, which requires the request passed by gameserver to assign values to multiple fields. If one of the keys does not exist when the increase operation is performed, it can be set by the SetAddableIncreaseFlag function. If the key does not exist, it will insert the key and perform the increase operation. The non-increase field of the key will not be actually stored, and the default value of the non-increase field will be used when the record is read; if the key exists, the increase operation will be performed directly.

How do I reduce traffic costs when TcaplusDB reads records?

When TcaplusDB reads a record, it can be set so it does not return the value field if the record has no change in a fixed period of time, neither does it return the value field if the record version number does not change. For more information, see the SetFlags function.

Does TcaplusDB support rollbacks? What is the supported rollback granularity?

TcaplusDB supports rollbacks, including all-server/all-region rollback, single-table rollback, and can roll back N records from 100 billion records. It also supports cold standby time rollback (most recent 01:05:00 am), precise time rollback (to the second), and fuzzy rollback (you can specify the rollback rules). For speed reference, precise time rollback takes about 2 hours for a rollback of 300 GB data and 200 GB Ulog. The principle of the cold standby time rollback is to replace the engine file. The principle of precise time rollback is to roll back the cold standby engine file + Ulog to the needed time point. A key-based rollback requires you to block these keys first and then unblock them after TcaplusDB has finished the rollback.

How efficient are queries by partial keys (indexes) with TcaplusDB?

It is recommended to use queries by partial keys (indexes) in 1:N (N > 1024) app scenarios. The number of primary keys under a single index key is equal to 10 GB/the size of primary key of a single record. A single read-write index operation takes about 100 ms (there are more than 100,000 pieces of data records under a single index key).

What is the timeout mechanism of the TcaplusDB API? What does the 'it is timeout' error mean?

The TcaplusDB API assigns an ID to each request. After successful transmission, the ID is added to the timeout data structure. If the response packet for this request comes back, the ID is then deleted from the data structure. If the response packet hasn’t been processed by the application layer within 3 seconds, an error log will be printed with keywords including 'it is timeout'. At this point, it is necessary to check if the gameserver is blocked. It might be due to packet loss while the tcaproxy (access layer) is returning packets to the gameserver side, or the response packet has arrived at the gameserver side, but the gameserver hasn't processed it in time TcaplusDB recommends implementing your own timeout mechanism, allowing for the retrying of timed-out requests and other processes.

What are the roles of SendRequest, OnUpdate, and ReceiveResponse functions of TcaplusDB API?

The role of SendRequest is to send requests. This request may have been sent to the network, or it may be blocked in the sending channel of the gameserver and a tcaproxy (access layer). The role of ReceiveResponse is to get the response packet from the local receive queue. OnUpdate is responsible for sending the requests of the send queue to the network and receiving response packets from the network to the receive queue. In message-driven programming mode, the recommended call frequency for OnUpdate calls is 1 ms.

How does TcaplusDB achieve global auto increase of fields?

You need a single Definition table, set one value field type to int64_t (multiple value fields can enable counter arrays), multiple gameservers can concurrently perform an increase operation on a single value (no need to set version protection rules), and obtain the increase result of this return, then the result of this increase is globally incremental.

What rules are defined for queries by partial keys (indexes)?

The index key must be a part of the primary key, the index key must contain the shardkey, and the index key cannot be the primary key.

How do I achieve two-way query of the ID and name of a single table?

The third key field x is used as the shardkey, and the index is built on ID and x, name and x to achieve this feature. For example, when storing player information, the player's district can be added, that is, the primary key is uin, name, district, and the index key is uin and district, and name and district.

Does tcaplus_client support the display of fields at the second nesting level or above?

Yes. You may execute help select to see how select * into a.xml is used.

What should be noted when changing the table in TcaplusDB?

1. You can only add new fields. You cannot modify the type and name of an existing field, or delete an existing field. To modify these, you need to dynamically modify the table structure.
2. The length of an array or string in a non-primary key field can be increased but not reduced. To modify these, you need to dynamically modify the table structure.
3. For a new field, its version should be incremented by 1 from the existing version number. Accordingly, the entire xml file’s version number (at the top of the file, the Definition's) should also be incremented by 1 (consistent with the new field’s version number). The TcaplusDB table must be updated before making changes to the gameserver side table. If you need to dynamically modify the table structure, TcaplusDB supports it, please submit a ticket and select "Other Tencent Cloud Products" to apply.

What should be noted when defining the table in TcaplusDB?

1. The refer field needs to be added to the count field.
2. The sub-table factors requires high dispersion.
3. The index key cannot be the same as the primary key.

How does the backend perform version control when the TcaplusDB table structure changes?

TcaplusDB solves multi-version compatibility issues based on the table's version number (Version No.), meaning the TcaplusDB storage layer will store data of the same table with different version numbers; therefore, when the gameserver or client performs data read and write operations, you need to specify the table's version number.
When different clients alternately write to the same table and use different versions of the table Definition, PB tables and TDR tables handle differential fields differently.
Assuming gamesvr1: the table has fields abc
Assuming gamesvr2: the table has fields ab
Assuming TcaplusDB: the table has fields abc
For PB tables:
1. Assuming abc are PB table fields, and two servers alternately write, the c field will be cleared.
For TDR tables:
1. Assuming abc are primary TDR table fields, and two servers alternately write, the c field will not be cleared.
2. Assuming abc are secondary TDR table fields, and two servers alternately write, the c field will be cleared.

How does TcaplusDB handle request latency?

If a request does not respond within 3 seconds, TcaplusDB will log an error containing the keyword timeout; it is recommended that the client request code also includes timeout logic or retry count.

How does TcaplusDB ensure read-write request stability?

TcaplusDB defaults to a Master-Slave model where the Master handles user read and write requests and the Slave acts as a hot standby node. When there is a sudden surge in QPS, read-write shunting will automatically activate, with the Master handling write operations and the Slave handling read operations until background expansion is complete.

Does TcaplusDB support a retention policy?

Yes, TcaplusDB will retain all data by default and allows users to set a retention period. Expired data will be automatically eliminated. This is currently supported by ticket.

Does TcaplusDB support cross-regional migration?

Yes, TcaplusDB supports both live migration (using cross-zone hot standby) and cold migration. It allows data export as Json files and also supports MySQL data import into TcaplusDB, currently supported by ticket.

How does TcaplusDB ensure hot data?

TcaplusDB uses the LRU cache algorithm to ensure data hotness.

How does TcaplusDB store gamer data?

A single TcaplusDB record represents a single player's data, operated based on primary key fields or indexes.

Can an index be added or a primary key modified after TcaplusDB table creation?

No, if there is a need for modifications, the table must be recreated.

Does TcaplusDB support transactions?

Not at the moment. It is recommended to operate the relevant field definitions in the same table for a transaction-like experience.

Will asynchronous request responses in a single thread be processed sequentially? Does it require using asyncid for synchronization? (primarily for features, not using sync API)

In a single thread, read and write operations for the same key are processed sequentially, ensuring order. The sequence of operations for different keys is not guaranteed. If the project team uses asyncid to map request and response, it works as a passthrough field including asyncid, sequence, and userbuff.

What is the delete performance? Is it necessary to use the update command instead of delete?

Delete is a regular write operation with no performance issues, and the project team can perform delete operations at any time.

Threads and Concurrency

The TcaplusDB API is single-threaded and does not support multithreading. One tcaplus API object corresponds to one request and one response. Since the TcaplusDB API is non-thread-safe, multiple threads cannot use the same TcaplusDB API object. For concurrent scenarios, it is recommended that each thread use a separate TcaplusDB API object. From an operational perspective, having 1-2 TcaplusDB API instances on a single machine is sufficient, and the QPS of a single TcaplusDB API instance can reach 70,000-100,000.

What is the SDK memory usage?

A TcaplusDB API instance will occupy around 200M of physical memory. The instance uses static allocation, and memory consumption mainly lies in the protocol, with separate structures for receiving and sending packets. Therefore, some memory needs to be pre-allocated. Note: Different versions of the TcaplusDB API may pre-allocate different amounts of memory due to varying supported record sizes.

Can the Tcaplus primary key be a structure or only a basic type?

Using structures is not recommended. Although theoretically possible, using structures can complicate later stages for various tools, problem location, rollback, and providing the key.

Error 525 when requesting to read data

This generally indicates a backend timeout. If there is high concurrency, it could be an issue with communication between the gameserver and tcaproxy. Check the following:
Is tcaproxy functioning normally?
Is the TcaplusDB API version greater than the access layer version?
Has the TCP connection count of tcaproxy exceeded the limit?

Does distributed index support the delete method with where conditions?

You can use distributed indexing to read the data and then delete each entry one by one.

If a newly added table group with a new global index rolls back data, will the index remain or be rebuilt?

Distributed indexing is automatically maintained during data insertion. When using data import, data will be synchronized to the global index.

If a table has multiple primary keys, can you delete the data by specifying one of the primary keys?

Primary key, delete according to the delete command. Local index, delete according to the deletebypartkey command.

If the telnet ip port can access the tcapdir address but fails to connect to the database cluster, how to investigate?

Telnet to port 9999
Confirm whether it's a Tencent Cloud environment or an ordinary cluster environment. Tencent Cloud requires connecting to the customer's VIP+9999 port, while ordinary clusters connect to the real dirip+9999 port.
Since a cluster has multiple dirs, it's best to get the API connection log to see which dir failed to connect or if connected and failed due to proxy version higher than the API version.

Does Tcaplus support different zones within a single app using different protocols?

Tcaplus supports different zones within a single app using different protocols, e.g., zone1 using PB protocol and zone2 using TDR protocol.

Will table reconstruction or deletion and recreation affect the cache configuration?

Reconstruction can retain the configuration, but deleting and recreating will remove cache backup since cache is deleted with the table.

Does adding columns require table reconstruction?

Adding columns only requires performing online modification.

Does expanding the count in the table structure require table reconstruction?

No need, you can directly modify it, and there's no need to add a version number. The count can only be increased, not decreased.

Do you need to change the version number of tables.xml when deleting a table or rows from a table?

For an existing table, you cannot delete fields. You can only add new fields. If you need to delete fields, you must delete the entire table and then rebuild it.

Can the length of the blob on the business side be dynamically adjusted without affecting the business side?

Yes, the count can be increased since it was defined in the count, and there's no need to add a version number.

Does changing a primary field in the table require updating the write cache?

If these fields do not need to be configured for write cache, then no changes are necessary. If they need to be configured, then the write cache configuration must be updated.

Redis Replacement Scenarios

1. Can TcaplusDB replace Redis's pub/sub feature?
Currently, TcaplusDB does not have a pub/sub feature. You can simulate it using a list table, such as Process A writing data to the list table and Process B reading data from the list table. This would increase code modification costs.
2. Does it support Redis's expired (auto expiration feature)?
Currently, TcaplusDB supports data elimination. For example, if the account table is set for 30-day elimination, it will physically delete data with no write operations within 30 days. This feature is supported.
3. The TcaplusDB Client has setttl. Does it support the API?
Setting setttl for a single record is supported by the TcaplusDB API. However, in the project group's usage scenario, you can set full table data elimination. For example, a table with hundreds of millions of records can be set to eliminate data with no write operations within 30 days.
4. Can TcaplusDB's list table be used to replace Redis's stored set feature?
If it's TopN, it can be achieved using a list table, meaning this feature is supported.
5. Is there something like Redis's pipeline, where multiple queries can be processed with a single request? For example, if there are 10 queries, 1 request can handle all 10 queries.
TcaplusDB provides batch operations to meet similar needs. For details, please refer to the SDK: https://github.com/tencentyun/tcaplusdb-go-sdk/blob/v0.0.10/tdr/request/batchget_req.go.

Rules for the growth of List table indexes

1. idx starts from 0
2. idx increments by 1 starting from 0 until it reaches the maximum value of the int type. Then, an available idx will be used, meaning under any circumstances, the currently used idx will not repeat.
3. If a key is deleted, idx starts from 0 but can also continue from the last idx. Default is from 0, but can be set to continue from the last idx using SetFlags.
/*TCAPLUS_FLAG_LIST_RESERVE_INDEX_HAVING_NO_ELEMENTS
* After setting this flag, when deleting the last element of a List table, the index and version need to be preserved.
* For operations like ListDelete, ListDeleteBatch, and ListDeleteAll, when deleting the last element of a list table,
* Setting this flag ensures that when a new List record is written, the version number increases incrementally and is not reset to 1.
*
* Use cases :
* Businesses need to decide whether to preserve the index and version when deleting the last element of a table
* Mainly concerns the user experience with List tables
*
*/ int SetFlags(int32_t flag);
Indexes are discontinuous, they only increase, for example: 1 2 3 4 5, deleting 3 becomes 1 2 4 5. If AddRecord(2) is executed, it becomes 1 2 6 4 5.
If all elements of the list under a key are deleted, it is equivalent to the deletion of the key itself.
listaddafter supports deletion at the head and insertion at the tail; or insertion at the head and deletion at the tail.
listdelete, delete idx.
TCAPLUS_API_LIST_PRE_FIRST_INDEX: New element is inserted before the first element. TCAPLUS_API_LIST_LAST_INDEX: New element is inserted after the last element

Regarding the upper limit issue of the increase-related interface, if the current value is 97 and increase5 with an upper limit of 100 is executed, will it succeed partially?

It won't succeed. It will return the error code SVR_ERR_FAIL_OUT_OF_USER_DEF_RANGE.

If tcaplus performs an insert operation on the table and the primary key of two consecutive insert operations is the same, will the second operation overwrite the first or fail?

The second operation will fail with error code -1293 SVR_ERR_FAIL_RECORD_EXIST indicating the insert record already exists

In the protoc file, can all defined types be used in tcaplus? For example, the any type

Yes, but conditional updates do not support any or union types.

How to set up traverse backup table in go SDK?

Set it through the SetOnlyReadFromSlave interface call

ListGetAllRequest returns an error SVR_ERR_FAIL_INVALID_SUBSCRIPT

The parameters for offset and limit are incorrect when pulling according to them. Please check the offset and limit parameters.

Creation method of local index and distributed index (global index)

Local indexes are defined in the table structure file and cannot be modified or deleted once defined. Distributed indexes are created on the corresponding console page (Tencent Cloud Console) and can be modified or recreated.

Does distributed index (global index) support fuzzy search with segmentation for strings?

Supports LIKE fuzzy query, but does not support word segmentation search.

Can fields in the table Definition be deleted?

Fields in an existing table cannot be deleted

In PB Table's add operation, if add fails because data already exists, is there a way to return the existing data?

Yes, in the int SetMessageOption(const ::google::protobuf::Message &msg, int32_t item, const std::string &option) function, the option can be set to return old data of all fields in the change record.

Does TcaplusDB Go SDK support connecting to the directory server (Tcapdir) via domain name?

Supports connecting to the directory server (Tcapdir) via domain name.

For TcaplusDB's list structure, is there an interface that only queries the number of elements in the list?

Currently, it is not possible to query the size of a list

What is the default elimination method when the Tcaplus list table is full?

There are three elimination methods, with TCAPLUS_LIST_SHIFT_HEAD removing the first element as the default.
TCAPLUS_LIST_SHIFT_NONE: Deleting elements is not allowed, and insertion fails if the LIST is full
TCAPLUS_LIST_SHIFT_HEAD: Removes the first element
TCAPLUS_LIST_SHIFT_TAIL: Removes the last element

If Tcaplus single row record is set to be eliminated after 300 seconds, is it eliminated 300 seconds after insertion? How is the lease renewed during this period?

Table level data elimination is based on the record's last modified time; an update or replace operation will automatically renew the term. The accuracy is roughly at the day level, suitable for scenarios such as retaining emails or battle records from the last 30 days. Record level elimination is set and renewed via setttl, suitable for scenarios where precise ttl time or different elimination times for different records are required. Accurate to milliseconds.

A TcaplusServer object can only access different zones within one set

1. Can multiple TcaplusServer objects achieve cross-set access -- Each object can only access one set, not across sets; for cross-set access, multiple APIs or multiple TcaplusServer objects can be used.
2. How is memory usage of multiple TcaplusServer objects -- Each API approximately uses around 40M of memory.

For the UpdateNetwork API, does this interface internally call functions like sleep or epoll_wait?

UpdateNetwork is a user thread and will not sleep, it sends and receives packets via the network thread. Only the network thread will use epoll_wait, which the user does not need to be concerned with.

What happens if SetResultFlag(2) and SetResultFlagForFail(0) are called simultaneously?

It's recommended not to use them together; SetResultFlagForFail and SetResultFlagForSuccess are recommended to be used in combination. If both SetResultFlag(2) and SetResultFlagForFail(0) are called simultaneously, the last setting will take effect.

Can Tcaplus directly use RepeatedPtrField as table fields for storage operations? Are there differences between using proto primitive types and structure types as basic Tcaplus table field storage methods?

Yes, there is no difference. Note that deeply nested structures may consume more CPU.

Does Tcaplus have an API for atomic operations?

Tcaplus has optimistic locking, supports single key transactions, TCAPLUS_CMD_INCREASE_REQ for auto-increment and auto-decrement operations, supports conditional updates under single key, and does not support other transactional operations.

In the FieldGet interface, if the dottedpaths field is empty, does it return all fields or only the key field with other common fields being empty?

FieldGet returns the required fields. If it is empty, only the key field is returned. To get all fields, you can use Get.

In the case of getbypartkey, if the business only wants to obtain the number of records that meet certain conditions, can it return only the number of records?

You can get one record by calling SetResultLimit(1), but to get the total number, you can use GetRecordMatchCount.

Can the ListNum of a list type table be modified?

The ListNum of a list type table can be increased but not decreased. ListNum is a required attribute and is generally set in the table Definition based on business size estimates

Does expanding the size in the table structure require modifying the field version?

No need, you can directly modify it. Size can only be increased, not decreased.

Is there a way to obtain the latest n records without knowing the index of the list table?

If the insertion is done in chronological order using addafter, you can directly retrieve from the tail using listgetall. SetResultLimit can specify the number of records. Alternatively, you can use a sortlist table, add a time field, and sort by time.

API access error: dir sign up fail, ret:-279, how to resolve?

Check if the business password is correct; check if the dir address is correct.

Does Tcaplus support fuzzy search and case insensitivity?

Supports fuzzy search, requires creating distributed index queries. Case sensitive.

Can there be multiple different TcaplusService::TcaplusServer in the same process?

Yes, hold multiple service API handles and initialize them separately.