mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2025-02-25 18:55:28 -06:00
Merge pull request #793 from yabinmeng/main
Add README file and adjust sample yaml files
This commit is contained in:
commit
8602d5b532
@ -103,7 +103,8 @@ public abstract class PulsarClientOpDispenser extends PulsarBaseOpDispenser {
|
|||||||
|
|
||||||
protected LongFunction<Set<PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE>> getStaticErrSimuTypeSetOpValueFunc() {
|
protected LongFunction<Set<PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE>> getStaticErrSimuTypeSetOpValueFunc() {
|
||||||
LongFunction<Set<PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE>> setStringLongFunction;
|
LongFunction<Set<PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE>> setStringLongFunction;
|
||||||
setStringLongFunction = (l) -> parsedOp.getOptionalStaticValue("seqerr_simu", String.class)
|
setStringLongFunction = (l) ->
|
||||||
|
parsedOp.getOptionalStaticValue(PulsarAdapterUtil.DOC_LEVEL_PARAMS.SEQERR_SIMU.label, String.class)
|
||||||
.filter(Predicate.not(String::isEmpty))
|
.filter(Predicate.not(String::isEmpty))
|
||||||
.map(value -> {
|
.map(value -> {
|
||||||
Set<PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE> set = new HashSet<>();
|
Set<PulsarAdapterUtil.MSG_SEQ_ERROR_SIMU_TYPE> set = new HashSet<>();
|
||||||
@ -118,7 +119,9 @@ public abstract class PulsarClientOpDispenser extends PulsarBaseOpDispenser {
|
|||||||
|
|
||||||
return set;
|
return set;
|
||||||
}).orElse(Collections.emptySet());
|
}).orElse(Collections.emptySet());
|
||||||
logger.info("seqerr_simu: {}", setStringLongFunction.apply(0));
|
logger.info(
|
||||||
|
PulsarAdapterUtil.DOC_LEVEL_PARAMS.SEQERR_SIMU.label + ": {}",
|
||||||
|
setStringLongFunction.apply(0));
|
||||||
return setStringLongFunction;
|
return setStringLongFunction;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,7 @@ public class PulsarAdapterUtil {
|
|||||||
TRANSACT_BATCH_NUM("transact_batch_num"),
|
TRANSACT_BATCH_NUM("transact_batch_num"),
|
||||||
ADMIN_DELOP("admin_delop"),
|
ADMIN_DELOP("admin_delop"),
|
||||||
SEQ_TRACKING("seq_tracking"),
|
SEQ_TRACKING("seq_tracking"),
|
||||||
|
SEQERR_SIMU("seqerr_simu"),
|
||||||
RTT_TRACKING_FIELD("payload_traking_field"),
|
RTT_TRACKING_FIELD("payload_traking_field"),
|
||||||
MSG_DEDUP_BROKER("msg_dedup_broker"),
|
MSG_DEDUP_BROKER("msg_dedup_broker"),
|
||||||
E2E_STARTING_TIME_SOURCE("e2e_starting_time_source");
|
E2E_STARTING_TIME_SOURCE("e2e_starting_time_source");
|
||||||
@ -63,6 +64,43 @@ public class PulsarAdapterUtil {
|
|||||||
return Arrays.stream(DOC_LEVEL_PARAMS.values()).anyMatch(t -> t.label.equals(param));
|
return Arrays.stream(DOC_LEVEL_PARAMS.values()).anyMatch(t -> t.label.equals(param));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////
|
||||||
|
// Message processing sequence error simulation types
|
||||||
|
public enum MSG_SEQ_ERROR_SIMU_TYPE {
|
||||||
|
OutOfOrder("out_of_order"),
|
||||||
|
MsgLoss("msg_loss"),
|
||||||
|
MsgDup("msg_dup");
|
||||||
|
|
||||||
|
public final String label;
|
||||||
|
|
||||||
|
MSG_SEQ_ERROR_SIMU_TYPE(String label) {
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Map<String, MSG_SEQ_ERROR_SIMU_TYPE> MAPPING = new HashMap<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (MSG_SEQ_ERROR_SIMU_TYPE simuType : values()) {
|
||||||
|
MAPPING.put(simuType.label, simuType);
|
||||||
|
MAPPING.put(simuType.label.toLowerCase(), simuType);
|
||||||
|
MAPPING.put(simuType.label.toUpperCase(), simuType);
|
||||||
|
MAPPING.put(simuType.name(), simuType);
|
||||||
|
MAPPING.put(simuType.name().toLowerCase(), simuType);
|
||||||
|
MAPPING.put(simuType.name().toUpperCase(), simuType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<MSG_SEQ_ERROR_SIMU_TYPE> parseSimuType(String simuTypeString) {
|
||||||
|
return Optional.ofNullable(MAPPING.get(simuTypeString.trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static boolean isValidSeqErrSimuType(String item) {
|
||||||
|
return Arrays.stream(MSG_SEQ_ERROR_SIMU_TYPE.values()).anyMatch(t -> t.label.equals(item));
|
||||||
|
}
|
||||||
|
public static String getValidSeqErrSimuTypeList() {
|
||||||
|
return Arrays.stream(MSG_SEQ_ERROR_SIMU_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", "));
|
||||||
|
}
|
||||||
|
|
||||||
///////
|
///////
|
||||||
// Valid Pulsar API type
|
// Valid Pulsar API type
|
||||||
public enum PULSAR_API_TYPE {
|
public enum PULSAR_API_TYPE {
|
||||||
@ -382,43 +420,6 @@ public class PulsarAdapterUtil {
|
|||||||
return Arrays.stream(READER_MSG_POSITION_TYPE.values()).anyMatch(t -> t.label.equals(item));
|
return Arrays.stream(READER_MSG_POSITION_TYPE.values()).anyMatch(t -> t.label.equals(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
///////
|
|
||||||
// Message processing sequence error simulation types
|
|
||||||
public enum MSG_SEQ_ERROR_SIMU_TYPE {
|
|
||||||
OutOfOrder("out_of_order"),
|
|
||||||
MsgLoss("msg_loss"),
|
|
||||||
MsgDup("msg_dup");
|
|
||||||
|
|
||||||
public final String label;
|
|
||||||
|
|
||||||
MSG_SEQ_ERROR_SIMU_TYPE(String label) {
|
|
||||||
this.label = label;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Map<String, MSG_SEQ_ERROR_SIMU_TYPE> MAPPING = new HashMap<>();
|
|
||||||
|
|
||||||
static {
|
|
||||||
for (MSG_SEQ_ERROR_SIMU_TYPE simuType : values()) {
|
|
||||||
MAPPING.put(simuType.label, simuType);
|
|
||||||
MAPPING.put(simuType.label.toLowerCase(), simuType);
|
|
||||||
MAPPING.put(simuType.label.toUpperCase(), simuType);
|
|
||||||
MAPPING.put(simuType.name(), simuType);
|
|
||||||
MAPPING.put(simuType.name().toLowerCase(), simuType);
|
|
||||||
MAPPING.put(simuType.name().toUpperCase(), simuType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Optional<MSG_SEQ_ERROR_SIMU_TYPE> parseSimuType(String simuTypeString) {
|
|
||||||
return Optional.ofNullable(MAPPING.get(simuTypeString.trim()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static boolean isValidSeqErrSimuType(String item) {
|
|
||||||
return Arrays.stream(MSG_SEQ_ERROR_SIMU_TYPE.values()).anyMatch(t -> t.label.equals(item));
|
|
||||||
}
|
|
||||||
public static String getValidSeqErrSimuTypeList() {
|
|
||||||
return Arrays.stream(MSG_SEQ_ERROR_SIMU_TYPE.values()).map(t -> t.label).collect(Collectors.joining(", "));
|
|
||||||
}
|
|
||||||
|
|
||||||
///////
|
///////
|
||||||
// Primitive Schema type
|
// Primitive Schema type
|
||||||
public static boolean isPrimitiveSchemaTypeStr(String typeStr) {
|
public static boolean isPrimitiveSchemaTypeStr(String typeStr) {
|
||||||
|
@ -26,8 +26,6 @@ client.authParams=
|
|||||||
|
|
||||||
### Producer related configurations (global) - producer.xxx
|
### Producer related configurations (global) - producer.xxx
|
||||||
# http://pulsar.apache.org/docs/en/client-libraries-java/#configure-producer
|
# http://pulsar.apache.org/docs/en/client-libraries-java/#configure-producer
|
||||||
producer.producerName=
|
|
||||||
producer.topicName=
|
|
||||||
producer.sendTimeoutMs=
|
producer.sendTimeoutMs=
|
||||||
producer.blockIfQueueFull=true
|
producer.blockIfQueueFull=true
|
||||||
|
|
||||||
|
@ -1 +1,253 @@
|
|||||||
<< to be added ... >>
|
- [1. Overview](#1-overview)
|
||||||
|
- [1.1. Issues Tracker](#11-issues-tracker)
|
||||||
|
- [2. Execute the NB Pulsar Driver Workload](#2-execute-the-nb-pulsar-driver-workload)
|
||||||
|
- [2.1. NB Pulsar Driver Yaml File High Level Structure](#21-nb-pulsar-driver-yaml-file-high-level-structure)
|
||||||
|
- [2.2. NB Pulsar Driver Configuration Parameters](#22-nb-pulsar-driver-configuration-parameters)
|
||||||
|
- [2.2.1. Global Level Parameters](#221-global-level-parameters)
|
||||||
|
- [2.2.2. Document Level Parameters](#222-document-level-parameters)
|
||||||
|
- [3. NB Pulsar Driver OpTemplates](#3-nb-pulsar-driver-optemplates)
|
||||||
|
- [4. Message Generation and Schema Support](#4-message-generation-and-schema-support)
|
||||||
|
- [4.1. Message Generation](#41-message-generation)
|
||||||
|
- [4.2. Schema Support](#42-schema-support)
|
||||||
|
|
||||||
|
# 1. Overview
|
||||||
|
|
||||||
|
This driver allows you to simulate and run different types of workloads (as below) against a Pulsar cluster through NoSQLBench (NB).
|
||||||
|
* Admin API - create/delete tenants
|
||||||
|
* Admin API - create/delete namespaces
|
||||||
|
* Admin API - create/delete topics
|
||||||
|
* Topics can be partitioned or non-partitioned
|
||||||
|
* Producer - publish messages with schema support
|
||||||
|
* Default schema type is byte[]
|
||||||
|
* Avro schema and KeyValue schema are also supported
|
||||||
|
* Consumer - consume messages with schema support and the following support
|
||||||
|
* Different subscription types
|
||||||
|
* Multi-topic subscription (including Topic patterns)
|
||||||
|
* Subscription initial position
|
||||||
|
* Dead letter topic policy
|
||||||
|
* Negative acknowledgement and acknowledgement timeout redelivery backoff policy
|
||||||
|
|
||||||
|
|
||||||
|
## 1.1. Issues Tracker
|
||||||
|
|
||||||
|
If you have issues or new requirements for this driver, please add them at the [pulsar issues tracker](https://github.com/nosqlbench/nosqlbench/issues/new?labels=pulsar).
|
||||||
|
|
||||||
|
# 2. Execute the NB Pulsar Driver Workload
|
||||||
|
|
||||||
|
In order to run a NB Pulsar driver workload, it follows similar command as other NB driver types. But it does have its unique execution parameters. The general command has the following format:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
<nb_cmd> run driver=pulsar threads=<thread_num> cycles=<cycle_count> web_url=<pulsar_web_svc_url> service_url=<pulsar_svc_url> config=<pulsar_client_config_property_file> yaml=<nb_scenario_yaml_file> [<other_common_NB_execution_parameters>]
|
||||||
|
```
|
||||||
|
|
||||||
|
In the above command, make sure the driver type is **pulsar** and provide the following Pulsar driver specific parameters:
|
||||||
|
* ***web_url***: Pulsar web service url and default to "http://localhost:8080"
|
||||||
|
* ***service_url***: Pulsar native protocol service url and default to "pulsar://localhost:6650"
|
||||||
|
* ***config***: Pulsar schema/client/producer/consumer related configuration (as a property file)
|
||||||
|
|
||||||
|
## 2.1. NB Pulsar Driver Yaml File High Level Structure
|
||||||
|
|
||||||
|
Just like other NB driver types, the actual NB Pulsar workload is defined in a YAML file with the following high level structure:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
description: |
|
||||||
|
...
|
||||||
|
|
||||||
|
bindings:
|
||||||
|
...
|
||||||
|
|
||||||
|
params:
|
||||||
|
...
|
||||||
|
|
||||||
|
blocks:
|
||||||
|
<block_1>:
|
||||||
|
ops:
|
||||||
|
op1:
|
||||||
|
<OpTypeIdentifier>: "<static_or_dynamic_value>"
|
||||||
|
<op_param_1>: "<some_value>"
|
||||||
|
<op_param_2>: "<some_value>"
|
||||||
|
...
|
||||||
|
|
||||||
|
<block_2>:
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
* ***description***: This is an (optional) section where to provide general description of the Pulsar NB workload defined in this file.
|
||||||
|
* ***bindings***: This section defines all NB bindings that are required in all OpTemplate blocks
|
||||||
|
* ***params***: This section defines **Document level** configuration parameters that apply to all OpTemplate blocks.
|
||||||
|
* ***blocks***: This section defines the OpTemplate blocks that are needed to execute Pulsar specific workloads. Each OpTemplate block may contain multiple OpTemplates.
|
||||||
|
|
||||||
|
## 2.2. NB Pulsar Driver Configuration Parameters
|
||||||
|
|
||||||
|
The NB Pulsar driver configuration parameters can be set at 3 different levels:
|
||||||
|
* Global level
|
||||||
|
* Document level
|
||||||
|
* The parameters at this level are those within a NB yaml file that impact all OpTemplates
|
||||||
|
* Op level (or Cycle level)
|
||||||
|
* The parameters at this level are those within a NB yaml file that are associated with each individual OpTemplate
|
||||||
|
|
||||||
|
Please **NOTE** that when a parameter is specified at multiple levels, the one at the lowest level takes precedence.
|
||||||
|
|
||||||
|
### 2.2.1. Global Level Parameters
|
||||||
|
|
||||||
|
The parameters at this level are those listed in the command line config properties file.
|
||||||
|
|
||||||
|
The NB Pulsar driver relies on Pulsar's [Java Client API](https://pulsar.apache.org/docs/en/client-libraries-java/) complete its workloads such as creating/deleting tenants/namespaces/topics, generating messages, creating producers to send messages, and creating consumers to receive messages. The Pulsar client API has different configuration parameters to control the execution behavior. For example, [this document](https://pulsar.apache.org/docs/en/client-libraries-java/#configure-producer) lists all possible configuration parameters for how a Pulsar producer can be created.
|
||||||
|
|
||||||
|
All these Pulsar "native" parameters are supported by the NB Pulsar driver, via the global configuration properties file (e.g. **config.properties**). An example of the structure of this file looks like below:
|
||||||
|
|
||||||
|
```properties
|
||||||
|
### Schema related configurations - MUST start with prefix "schema."
|
||||||
|
#schema.key.type=avro
|
||||||
|
#schema.key.definition=</path/to/avro-key-example.avsc>
|
||||||
|
schema.type=avro
|
||||||
|
schema.definition=</path/to/avro-value-example.avsc>
|
||||||
|
|
||||||
|
### Pulsar client related configurations - MUST start with prefix "client."
|
||||||
|
# http://pulsar.apache.org/docs/en/client-libraries-java/#client
|
||||||
|
client.connectionTimeoutMs=5000
|
||||||
|
client.authPluginClassName=org.apache.pulsar.client.impl.auth.AuthenticationToken
|
||||||
|
client.authParams=
|
||||||
|
# ...
|
||||||
|
|
||||||
|
### Producer related configurations (global) - MUST start with prefix "producer."
|
||||||
|
# http://pulsar.apache.org/docs/en/client-libraries-java/#configure-producer
|
||||||
|
producer.sendTimeoutMs=
|
||||||
|
producer.blockIfQueueFull=true
|
||||||
|
# ...
|
||||||
|
|
||||||
|
### Consumer related configurations (global) - MUST start with prefix "consumer."
|
||||||
|
# http://pulsar.apache.org/docs/en/client-libraries-java/#configure-consumer
|
||||||
|
consumer.subscriptionInitialPosition=Earliest
|
||||||
|
consumer.deadLetterPolicy={"maxRedeliverCount":"5","retryLetterTopic":"public/default/retry","deadLetterTopic":"public/default/dlq","initialSubscriptionName":"dlq-sub"}
|
||||||
|
consumer.ackTimeoutRedeliveryBackoff={"minDelayMs":"10","maxDelayMs":"20","multiplier":"1.2"}
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
There are multiple sections in this file that correspond to different
|
||||||
|
categories of the configuration parameters:
|
||||||
|
* **`Pulsar Schema` related settings**:
|
||||||
|
* All settings under this section starts with **schema.** prefix.
|
||||||
|
* At the moment, there are 3 schema types supported
|
||||||
|
* Default raw ***byte[]***
|
||||||
|
* Avro schema for the message payload
|
||||||
|
* KeyValue based Avro schema for both message key and message payload
|
||||||
|
* **`Pulsar Client` related settings**:
|
||||||
|
* All settings under this section starts with **client.** prefix.
|
||||||
|
* This section defines all configuration parameters that are related with defining a PulsarClient object.
|
||||||
|
* See [Pulsar Doc Reference](https://pulsar.apache.org/docs/en/client-libraries-java/#default-broker-urls-for-standalone-clusters)
|
||||||
|
* **`Pulsar Producer` related settings**:
|
||||||
|
* All settings under this section starts with **producer** prefix.
|
||||||
|
* This section defines all configuration parameters that are related with defining a Pulsar Producer object.
|
||||||
|
* See [Pulsar Doc Reference](https://pulsar.apache.org/docs/en/client-libraries-java/#configure-producer)
|
||||||
|
* **`Pulsar Consumer` related settings**:
|
||||||
|
* All settings under this section starts with **consumer** prefix.
|
||||||
|
* This section defines all configuration parameters that are related with defining a Pulsar Consumer object.
|
||||||
|
* See [Pulsar Doc Reference](http://pulsar.apache.org/docs/en/client-libraries-java/#configure-consumer)
|
||||||
|
|
||||||
|
### 2.2.2. Document Level Parameters
|
||||||
|
|
||||||
|
For the Pulsar NB driver, Document level parameters can only be statically bound; and currently, the following Document level configuration parameters are supported:
|
||||||
|
|
||||||
|
* ***async_api*** (boolean):
|
||||||
|
* When true, use async Pulsar client API.
|
||||||
|
* ***use_transaction*** (boolean):
|
||||||
|
* When true, use Pulsar transaction.
|
||||||
|
* ***admin_delop*** (boolean):
|
||||||
|
* When true, delete Tenants/Namespaces/Topics. Otherwise, create them.
|
||||||
|
* Only applicable to administration related operations
|
||||||
|
* ***seq_tracking*** (boolean):
|
||||||
|
* When true, a sequence number is created as part of each message's properties
|
||||||
|
* This parameter is used in conjunction with the next one in order to simulate abnormal message processing errors and then be able to detect such errors successfully.
|
||||||
|
* ***seqerr_simu***:
|
||||||
|
* A list of error simulation types separated by comma (,)
|
||||||
|
* Valid error simulation types
|
||||||
|
* `out_of_order`: simulate message out of sequence
|
||||||
|
* `msg_loss`: simulate message loss
|
||||||
|
* `msg_dup`: simulate message duplication
|
||||||
|
* ***e2e_starting_time_source***:
|
||||||
|
* Starting timestamp for end-to-end operation. When specified, will update the `e2e_msg_latency` histogram with the calculated end-to-end latency. The latency is calculated by subtracting the starting time from the current time. The starting time is determined from a configured starting time source. The unit of the starting time is milliseconds since epoch.
|
||||||
|
* The possible values for `e2e_starting_time_source`:
|
||||||
|
* `message_publish_time` : uses the message publishing timestamp as the starting time
|
||||||
|
* `message_event_time` : uses the message event timestamp as the starting time
|
||||||
|
* `message_property_e2e_starting_time` : uses a message property `e2e_starting_time` as the starting time.
|
||||||
|
|
||||||
|
# 3. NB Pulsar Driver OpTemplates
|
||||||
|
|
||||||
|
For the NB Pulsar driver, each OpTemplate has the following format:
|
||||||
|
```yaml
|
||||||
|
blocks:
|
||||||
|
<some_block_name>:
|
||||||
|
ops:
|
||||||
|
<some_op_name>:
|
||||||
|
<OpTypeIdentifier>: <tenant|namespace|topic_name>
|
||||||
|
<op_param_1>: "<some_value>"
|
||||||
|
<op_param_2>: "<some_value>"
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
The `OpTypeIdentifier` determines which NB Pulsar workload type (`OpType`) to run, and it has the following value:
|
||||||
|
```java
|
||||||
|
public enum PulsarOpType {
|
||||||
|
AdminTenant,
|
||||||
|
AdminNamespace,
|
||||||
|
AdminTopic,
|
||||||
|
MessageProduce,
|
||||||
|
MessageConsume;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Its value is mandatory and depending on the actual identifier, its value can be one of the following:
|
||||||
|
* ***Tenant name***: for `AdminTenant` type
|
||||||
|
* ***Namespace name***: for `AdminNamespace` type and in format "<tenant>/<namespace>"
|
||||||
|
* ***Topic name***: for the rest of the types and in format [(persistent|non-persistent)://]<tenant>/<namespace>/<topic>
|
||||||
|
is mandatory for each NB Pulsar operation type
|
||||||
|
|
||||||
|
Each Pulsar `OpType` may have optional Op specific parameters. Please refer to [here](yaml_examples) for the example NB Pulsar YAML files for each OpType
|
||||||
|
|
||||||
|
# 4. Message Generation and Schema Support
|
||||||
|
|
||||||
|
## 4.1. Message Generation
|
||||||
|
|
||||||
|
A Pulsar message has three main components: message key, message properties, and message payload. Among them, message payload is mandatory when creating a message.
|
||||||
|
|
||||||
|
When running the "message producing" workload, the NB Pulsar driver is able to generate a message with its full content via the following OpTemplate level parameters:
|
||||||
|
* `msg_key`: defines message key value
|
||||||
|
* `msg_property`: defines message property values
|
||||||
|
* `msg_value`: defines message payload value
|
||||||
|
|
||||||
|
The actual values of them can be static or dynamic (which are determined by NB data binding rules)
|
||||||
|
|
||||||
|
For `msg_key`, its value can be either
|
||||||
|
* a plain text string, or
|
||||||
|
* a JSON string that follows the specified "key" Avro schema (when KeyValue schema is used)
|
||||||
|
|
||||||
|
For `msg_property`, its value needs to be a JSON string that contains a list of key-value pairs. An example is as below. Please **NOTE** that if the provided value is not a valid JSON string, the NB Pulsar driver will ignore it and treat the message as having no properties.
|
||||||
|
```
|
||||||
|
msg_property: |
|
||||||
|
{
|
||||||
|
"prop1": "{myprop1}",
|
||||||
|
"prop2": "{myprop2}"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For `msg_value`, its value can be either
|
||||||
|
* a plain simple text, or
|
||||||
|
* a JSON string that follows the specified "value" Avro schema (when Avro schema or KeyValue schema is used)
|
||||||
|
|
||||||
|
## 4.2. Schema Support
|
||||||
|
|
||||||
|
The NB Pulsar driver supports the following Pulsar schema types:
|
||||||
|
* Primitive schema types
|
||||||
|
* Avro schema type (only for message payload - `msg_value`)
|
||||||
|
* KeyValue schema type (with both key and value follows an Avro schema)
|
||||||
|
|
||||||
|
The following 2 global configuration parameters define the required schema type
|
||||||
|
* `schema.key.type`: defines message key type
|
||||||
|
* `schema.type`: defines message value type
|
||||||
|
For them, if the parameter value is not specified, it means using the default `byte[]/BYTES` type as the schema type. Otherwise, if it is specified as "avro", it means using Avro as the schema type.
|
||||||
|
|
||||||
|
The following 2 global configuration parameters define the schema specification (**ONLY** needed when Avro is the schema type)
|
||||||
|
* `schema.key.definition`: a file path that defines the message key Avro schema specification
|
||||||
|
* `schema.definition`: a file path the message value Avro schema specification
|
||||||
|
The NB Pulsar driver will throw an error if the schema type is Avro but no schema specification definition file is not provided or is not valid.
|
||||||
|
@ -9,8 +9,6 @@ params:
|
|||||||
|
|
||||||
blocks:
|
blocks:
|
||||||
admin-namespace-block:
|
admin-namespace-block:
|
||||||
tags:
|
|
||||||
phase: admin-namespace
|
|
||||||
ops:
|
ops:
|
||||||
op1:
|
op1:
|
||||||
AdminNamespace: "{tenant}/{namespace}"
|
AdminNamespace: "{tenant}/{namespace}"
|
@ -8,8 +8,6 @@ params:
|
|||||||
|
|
||||||
blocks:
|
blocks:
|
||||||
admin-tenant-block:
|
admin-tenant-block:
|
||||||
tags:
|
|
||||||
phase: admin-tenant
|
|
||||||
ops:
|
ops:
|
||||||
op1:
|
op1:
|
||||||
AdminTopic: "{tenant}"
|
AdminTopic: "{tenant}"
|
@ -10,8 +10,6 @@ params:
|
|||||||
|
|
||||||
blocks:
|
blocks:
|
||||||
admin-topic-block:
|
admin-topic-block:
|
||||||
tags:
|
|
||||||
phase: admin-topic
|
|
||||||
ops:
|
ops:
|
||||||
op1:
|
op1:
|
||||||
AdminTopic: "{tenant}/{namespace}/{topic}"
|
AdminTopic: "{tenant}/{namespace}/{topic}"
|
@ -0,0 +1,11 @@
|
|||||||
|
params:
|
||||||
|
async_api: "true"
|
||||||
|
|
||||||
|
blocks:
|
||||||
|
msg-consume-block:
|
||||||
|
ops:
|
||||||
|
op1:
|
||||||
|
MessageConsume: "tnt0/ns0/tp0"
|
||||||
|
consumerName: ""
|
||||||
|
subscriptionName: "mynbsub"
|
||||||
|
subscriptionType: "shared"
|
@ -1,28 +1,25 @@
|
|||||||
bindings:
|
bindings:
|
||||||
# message key and value
|
|
||||||
mykey: NumberNameToString()
|
|
||||||
location: Cities();
|
location: Cities();
|
||||||
well_id: ToUUID();ToString();
|
well_id: ToUUID();ToString();
|
||||||
sensor_id: ToUUID();ToString();
|
sensor_id: ToUUID();ToString();
|
||||||
reading_time: ToDateTime();
|
reading_time: ToDateTime();
|
||||||
reading_value: ToFloat(100);
|
reading_value: ToFloat(100);
|
||||||
|
|
||||||
# document level parameters that apply to all Pulsar client types:
|
|
||||||
params:
|
params:
|
||||||
async_api: "true"
|
async_api: "true"
|
||||||
|
|
||||||
blocks:
|
blocks:
|
||||||
msg-produce-block:
|
msg-produce-block:
|
||||||
tags:
|
|
||||||
phase: msg-send
|
|
||||||
ops:
|
ops:
|
||||||
op1:
|
op1:
|
||||||
MessageProduce: "tnt0/ns0/tp1"
|
MessageProduce: "tnt0/ns0/tp1"
|
||||||
|
producerName: ""
|
||||||
msg_key: |
|
msg_key: |
|
||||||
{
|
{
|
||||||
"Location": "{location}",
|
"Location": "{location}",
|
||||||
"WellID": "{well_id}"
|
"WellID": "{well_id}"
|
||||||
}
|
}
|
||||||
|
msg_properties: ""
|
||||||
msg_value: |
|
msg_value: |
|
||||||
{
|
{
|
||||||
"SensorID": "{sensor_id}",
|
"SensorID": "{sensor_id}",
|
||||||
@ -30,12 +27,3 @@ blocks:
|
|||||||
"ReadingTime": "{reading_time}",
|
"ReadingTime": "{reading_time}",
|
||||||
"ReadingValue": {reading_value}
|
"ReadingValue": {reading_value}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg-consume-block:
|
|
||||||
tags:
|
|
||||||
phase: msg-recv
|
|
||||||
ops:
|
|
||||||
op1:
|
|
||||||
MessageConsume: "tnt0/ns0/tp0"
|
|
||||||
subscription_name: "mynbsub"
|
|
||||||
# subscription_type: "shared"
|
|
@ -11,8 +11,6 @@ params:
|
|||||||
|
|
||||||
blocks:
|
blocks:
|
||||||
msg-produce-block:
|
msg-produce-block:
|
||||||
tags:
|
|
||||||
phase: msg-send
|
|
||||||
ops:
|
ops:
|
||||||
op1:
|
op1:
|
||||||
MessageProduce: "tnt0/ns0/tp0"
|
MessageProduce: "tnt0/ns0/tp0"
|
||||||
@ -23,12 +21,3 @@ blocks:
|
|||||||
"prop2": "{text_prop_val}"
|
"prop2": "{text_prop_val}"
|
||||||
}
|
}
|
||||||
msg_value: "{myvalue}"
|
msg_value: "{myvalue}"
|
||||||
|
|
||||||
msg-consume-block:
|
|
||||||
tags:
|
|
||||||
phase: msg-recv
|
|
||||||
ops:
|
|
||||||
op1:
|
|
||||||
MessageConsume: "tnt0/ns0/tp0"
|
|
||||||
subscriptionName: "mynbsub"
|
|
||||||
subscriptionType: "Shared"
|
|
Loading…
Reference in New Issue
Block a user