Merge pull request #10179 from kjellwinblad/kjell/fix/rule_engine_app_readme
docs: refine README.md for the emqx_rule_engine app
This commit is contained in:
commit
9870f4834e
|
@ -1,23 +1,46 @@
|
||||||
|
|
||||||
# emqx-rule-engine
|
# Emqx Rule Engine
|
||||||
|
|
||||||
IoT Rule Engine
|
The rule engine's goal is to provide a simple and flexible way to transform and
|
||||||
|
reroute the messages coming to the EMQX broker. For example, one message
|
||||||
|
containing measurements from multiple sensors of different types can be
|
||||||
|
transformed into multiple messages.
|
||||||
|
|
||||||
|
|
||||||
|
## Concepts
|
||||||
|
|
||||||
|
A rule is quite simple. A rule describes which messages it affects by
|
||||||
|
specifying a topic filter and a set of conditions that need to be met. If a
|
||||||
|
message matches the topic filter and all the conditions are met, the rule is
|
||||||
|
triggered. The rule can then transform the message and route it to a different
|
||||||
|
topic, or send it to another service (defined by an EMQX bridge). The rule
|
||||||
|
engine's message data transformation is designed to work well with structured data
|
||||||
|
such as JSON, avro, and protobuf.
|
||||||
|
|
||||||
|
|
||||||
|
A rule consists of the three parts **MATCH**, **TRANSFORM** and **ACTIONS** that are
|
||||||
|
described below:
|
||||||
|
|
||||||
|
* **MATCH** - The rule's trigger condition. The rule is triggered when a message
|
||||||
|
arrives that matches the topic filter and all the specified conditions are met.
|
||||||
|
* **TRANSFORM** - The rule's data transformation. The rule can select data from the
|
||||||
|
incoming message and transform it into a new message.
|
||||||
|
* **ACTIONS** - The rule's action(s). The rule can have one or more actions. The
|
||||||
|
actions are executed when the rule is triggered. The actions can be to route
|
||||||
|
the message to a different topic, or send it to another service (defined by
|
||||||
|
an EMQX bridge).
|
||||||
|
|
||||||
## Concept
|
|
||||||
|
|
||||||
```
|
|
||||||
iot rule "Rule Name"
|
|
||||||
when
|
|
||||||
match TopicFilters and Conditions
|
|
||||||
select
|
|
||||||
para1 = val1
|
|
||||||
para2 = val2
|
|
||||||
then
|
|
||||||
take action(#{para2 => val1, #para2 => val2})
|
|
||||||
```
|
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
|
The following diagram shows how the rule engine is integrated with the EMQX
|
||||||
|
message broker. Incoming messages are checked against the rules, and if a rule
|
||||||
|
matches, it is triggered with the message as input. The rule can then transform
|
||||||
|
or split the message and/or route it to a different topic, or send it to another
|
||||||
|
service (defined by an EMQX bridge).
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|-----------------|
|
|-----------------|
|
||||||
Pub ---->| Message Routing |----> Sub
|
Pub ---->| Message Routing |----> Sub
|
||||||
|
@ -28,11 +51,33 @@ iot rule "Rule Name"
|
||||||
| Rule Engine |
|
| Rule Engine |
|
||||||
|-----------------|
|
|-----------------|
|
||||||
| |
|
| |
|
||||||
Backends Services Bridges
|
Services Bridges (defined by EMQX bridges)
|
||||||
```
|
```
|
||||||
|
|
||||||
## SQL for Rule query statement
|
## Domain Specific Language for Rules
|
||||||
|
|
||||||
|
The **MATCH** and **TRANSFORM** parts of the rule are specified using a domain
|
||||||
|
specific language that looks similar to SQL. The following is an example of a
|
||||||
|
rule engine statement. The `from "topic/a"` part specifies the topic filter
|
||||||
|
(only messages to the topic `topic/a` will be considered). The `where t > 50`
|
||||||
|
part specifies the condition that needs to be met for the rule to be triggered.
|
||||||
|
The `select id, time, temperature as t` part specifies the data transformation
|
||||||
|
(the selected fields will remain in the transformed message payload). The `as
|
||||||
|
t` part specifies that the `temperature` field name is changed to `t` in the
|
||||||
|
output message. The name `t` can also be used in the where part of the rule as
|
||||||
|
an alias for `t`.
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
select id, time, temperature as t from "topic/a" where t > 50;
|
select id, time, temperature as t from "topic/a" where t > 50
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This just scratches the surface of what is possible with the rule engine. The
|
||||||
|
full documentation is available at [EMQX Rule
|
||||||
|
Engine](https://www.emqx.io/docs/en/v5.0/data-integration/rules.html). For
|
||||||
|
example, there are many built-in functions that can be used in the rule engine
|
||||||
|
language to help in doing transformations and matching. One of the [built-in
|
||||||
|
functions allows you to run JQ
|
||||||
|
queries](https://www.emqx.io/docs/en/v5.0/data-integration/rule-sql-jq.html)
|
||||||
|
which allows you to do complex transformations of the message.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue