11. 构建EMQ连接Kafka的插件,实现消息由MQTT Broker传递至Kafka

本文提供了两种方式使EMQ桥接Kafka,一种是自己构建Kafka插件,另一种是安装企业版EMQ在里面配置桥接Kafka即可。

* [构建Kafka插件——环境准备]

(1)make:

sudo apt-get install make

(2)git:

sudo apt-get install git

(3)由于需指定Erlang R21.2+ 版本,因此选择手动安装:

方式一:网上下载安装包安装
参考文档:
Ubuntu16.0.4安装erlang21.1.1

Ubuntu16.04 安装Erlang(rabbitmq安装第一步)

方式二:编译安装

  • 环境准备
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install m4
sudo apt-get install unixodbc unixodbc-dev
# sudo apt-get install freeglut3-dev libwxgtk3.0-dev
sudo apt-get install xsltproc 
sudo apt-get install fop 
sudo apt-get install tk8.5

下载erlang源码压缩包,

http://erlang.org/download/otp_src_21.2.tar.gz 

解压otp_src_21.2.tar.gz

tar -zxvf otp_src_21.2.tar.gz

创建Erlang目录

mkdir /home/user/erlang/otp_src_21.2

进入otp_src_21.2,执行configure命令并设置安装后的位置

./configure --prefix=/home/user/erlang/otp_src_21.2

拓展知识Linux ./configure --prefix 命令是什么意思?

执行编译,安装

make && make install

最后检验一下是否安装正确:

bin/erl

在这里插入图片描述
退出命令:halt().

配置环境变量

sudo vim /etc/profile


export ERLANG_HOME=/home/user_1/erlang/otp_src_21.2
export PATH=$ERLANG_HOME/bin:$PATH

生效变量:source /etc/prfile

拓展知识:
Linux 命令详解(三)./configure、make、make install 命令

make 和 make install 的区别

参考文章:
Linux环境CentOS7安装Erlang环境

CentOS7安装erlang的方法

在ubuntu上安装Erlang开发环境

Ubuntu16.04 安装Erlang(楼主亲测,真实有效)

1、编译安装EMQ X

(1)获取源码

$ git clone -b v3.0.1 https://github.com/emqx/emqx-rel.git

注:本次选用EMQX的3.0.1版本

(2)设置环境变量

$ export EMQX_DEPS_DEFAULT_VSN=v3.0.1

(3)编译

$ cd emqx-rel && make

参考文档:
编译安装EMQ X

emq 源码编译过程

【服务器篇之EMQ源码编译】

2、构建Kafka插件

参考文档:
【跟我一起搭建物联网平台】6、EMQX之Kafka插件编译安装

EMQ集成Kafka插件编写过程 emq_plugin_kafka

EMQ扩展插件-emq_plugin_kafka

物联网架构成长之路(4)-EMQ插件创建

EMQ X Broker 连接kafka插件(一)


便捷方式

* [Other:获取企业版EMQ桥接Kafka]

进入:EMQ官网
注册一个账号后,可以获取一个月企业版EMQ的使用权。
在这里插入图片描述
在这里插入图片描述

  • EMQ X桥接Kafka

在这里插入图片描述

(1)创建Kafka主题

先创建Kafka主题

$ bin/kafka-topics --create --bootstrap-server localhost:9092 --topic emqx-test --partitions 1 --replication-factor 1

(2)创建资源

打开 EMQ X Dashboard,进入左侧菜单的 资源 页面,点击 新建 按钮,键入 Kafka 服务器信息进行资源创建。
在这里插入图片描述
EMQ X 集群中节点所在网络环境可能互不相同,资源创建成功后点击列表中 状态按钮,查看各个节点资源连接状况,如果节点上资源不可用,请检查配置是否正确、网络连通性,并点击 重连 按钮手动重连。
在这里插入图片描述

(3)定义消息筛选规则

进入左侧菜单的 规则 页面,点击 新建 按钮,进行规则创建。这里选择触发事件 消息发布,在消息发布时触发该规则进行数据处理。

选定触发事件后,我们可在界面上看到可选字段及示例 SQL:
在这里插入图片描述

筛选字段信息
规则引擎使用 SQL 语句进行 处理/整型 终端消息或连接事件等。本次提取只payload中的信息,其余client_id等信息不取。

SELECT
  payload
FROM
  "message.publish"
WHERE
  topic =~ 'test'

其中=~为主题通配符可对topic中的test主题进行筛选。

点击Test测试
在这里插入图片描述
添加相应动作,桥接Kafka
SQL 条件输入输出无误后,我们继续添加相应动作,配置写入 SQL 语句,将筛选结果桥接到 Kafka。

点击响应动作中的 添加 按钮,选择 桥接数据到Kafka 动作,选取刚刚选定的资源,Kafka 主题填写上文创建的emqx-test
在这里插入图片描述

(4)MQTT客户端发送消息测试

订阅test主题
在这里插入图片描述
发送publish

消费者查看

$ bin/kafka-console-consumer --bootstrap-server localhost:9092 --from-beginning --topic emqx-test

在这里插入图片描述
完成测试

  • 配置拓展

进入Plugins,点击emqx_bridge_kafka的Config进行配置
在这里插入图片描述
成功开启
在这里插入图片描述
配置 Kafka 集群地址

## Kafka 服务器地址
## bridge.kafka.servers = 127.0.0.1:9092,127.0.0.2:9092,127.0.0.3:9092
bridge.kafka.servers = 127.0.0.1:9092

## Kafka 分区策略。可选值: per_partition | per_broker
bridge.kafka.connection_strategy = per_partition

bridge.kafka.min_metadata_refresh_interval = 5S

## Produce 写类型。可选值: sync | async
bridge.kafka.produce = sync

bridge.kafka.produce.sync_timeout = 3S

## 指定 replayq 在磁盘上存储消息的基本目录。
## 如果该配置项缺失活着设置为 undefined, replayq 将以使用内存的
## 的方式工作。也就是说,消息不在磁盘上排队 -- 在这种情况下,send
## 和 send_async API 的调用者负责处理在应用程序、网络或 kafka
## 干扰时可能丢失的消息。
## bridge.kafka.replayq_dir = /tmp/emqx_bridge_kafka/

## default=10MB, replayq 分段大小。
## bridge.kafka.producer.replayq_seg_bytes = 10MB

## producer required_acks. 可选值: all_isr | leader_only | none.
bridge.kafka.producer.required_acks = none

## default=10000. leader 在回复 producer 前等待副本的超时时间。
bridge.kafka.producer.ack_timeout = 10S

## 收集到一次 produce 请求中的最大字节数
bridge.kafka.producer.max_batch_bytes = 1024KB

## 收集到一次 produce 请求中的最少字节数
bridge.kafka.producer.min_batch_bytes = 0

## 在没有接收到上次请求的 ack 的情况下,可以提前发送的 batch 数。
## 如果消息必须严格按照顺序传递,则必须为0。
bridge.kafka.producer.max_send_ahead = 0

## 默认为无压缩
## bridge.kafka.producer.compression = no_compression

## 默认值为 base64, 可选值: base64 | plain
## bridge.kafka.encode_payload_type = base64

## bridge.kafka.sock.buffer = 32KB
## bridge.kafka.sock.recbuf = 32KB
bridge.kafka.sock.sndbuf = 1MB
## bridge.kafka.sock.read_packets = 20

配置 Kafka 桥接规则

## Bridge Kafka Hooks
## ${topic}: the kafka topics to which the messages will be published.
## ${filter}: the mqtt topic (may contain wildcard) on which the action will be performed.

## Client Connected Record Hook
bridge.kafka.hook.client.connected.1     = {"topic": "client_connected"}

## Client Disconnected Record Hook
bridge.kafka.hook.client.disconnected.1  = {"topic": "client_disconnected"}

## Session Subscribed Record Hook
bridge.kafka.hook.session.subscribed.1   = {"filter": "#",  "topic": "session_subscribed"}

## Session Unsubscribed Record Hook
bridge.kafka.hook.session.unsubscribed.1 = {"filter": "#",  "topic": "session_unsubscribed"}

## Message Publish Record Hook
bridge.kafka.hook.message.publish.1      = {"filter": "#",  "topic": "message_publish"}

## Message Delivered Record Hook
bridge.kafka.hook.message.delivered.1    = {"filter": "#",  "topic": "message_delivered"}

## Message Acked Record Hook
bridge.kafka.hook.message.acked.1        = {"filter": "#",  "topic": "message_acked"}

## More Configures
## partitioner strategy:
## Option:  random | roundrobin | first_key_dispatch
## Example: bridge.kafka.hook.message.publish.1 = {"filter":"#", "topic":"message_publish", "strategy":"random"}

## key:
## Option: ${clientid} | ${username}
## Example: bridge.kafka.hook.message.publish.1 = {"filter":"#", "topic":"message_publish", "key":"${clientid}"}

## format:
## Option: json | json
## Example: bridge.kafka.hook.message.publish.1 = {"filter":"#", "topic":"message_publish", "format":"json"}

在这里插入图片描述

参考文档:
EMQ X桥接转发

EMQ X 规则引擎系列(一):数据桥接到消息队列(Kafka)

EMQ X Enterprise (MQTT Broker) + Apache Kafka 构建高性能物联网消息处理后台

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰阳星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值