本地和Azure之间的Kafka事件交换方法

95 阅读3分钟

虽然在本地机器上或特定网络内设置Kafka并产生/消耗消息可能不是一项艰巨的任务,但当人们试图让它在网络上运行时,确实面临着挑战。

让我们考虑一个混合场景,即你的软件解决方案分布在两个不同的平台上(例如AWS和Azure或内部部署和Azure),并且需要将消息从一个平台上的Kafka集群路由到另一个平台上的Kafka集群。这可能是一个有效的业务场景,你正试图用一个云平台来整合你的解决方案,在这期间,你需要有这种路由,直到你完成迁移。即使从长远来看,由于各种业务和技术原因,也可能需要在多个平台上维护解决方案。

在这篇文章中,我们将讨论一个涉及本地机器(macOS)和Azure VM的简单设置。我们将讨论从本地机器向托管在Azure VM上的Kafka代理生成事件,以及在本地机器上消费这些事件的分步程序。虽然这并不包括上面描述的确切场景,但它给出了一个关于Kafka消息如何在网络上交换的合理想法。

前提条件

  • 带有Ubuntu服务器的Azure虚拟机
  • 安装了Homebrew的MacOS机器

在Azure VM上设置Kafka

更新软件包。

$ apt-get update

安装Java。

$ apt install default-jdk

下载Kafka。

$ wget https://downloads.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz

解压下载的文件。

$ tar -xzf kafka_2.133.1.0.tgz

改变目录到kafka_2.13-3.1.0。

$ cd kafka_2.13–3.1.0

启动ZooKeeper服务(在终端1)。

$ bin/zookeeper-server-start.sh config/zookeeper.properties

启动Kafka代理服务(在终端2)。

$ bin/kafka-server-start.sh config/server.properties

创建一个主题(在终端3)。

$ bin/kafka-topics.sh --create --topic azure-events --bootstrap-server localhost:9092

启动Kafka生产者(在终端3)并将事件写入上述主题。

$ bin/kafka-console-producer.sh --topic azure-events --bootstrap-server localhost:9092

启动Kafka消费者(在终端4)并从上述主题中读取事件。

$ bin/kafka-console-consumer.sh --topic azure-events --from-beginning --bootstrap-server localhost:9092

如果我们能够在Azure VM上无缝地生产和消费事件,这意味着上述设置是成功的,我们可以继续前进。

在本地机器(macOS)上设置Kafka

安装Java。

$ brew cask install java

安装Kafka。

$ brew install kafka

启动ZooKeeper服务(在终端1)。

$ zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties

启动Kafka代理服务(在终端2)。

$ kafka-server-start /usr/local/etc/kafka/server.properties

创建一个主题(在终端3)。

$ kafka-topics --create --topic local-events --bootstrap-server localhost:9092

启动Kafka生产者(在终端3)并将事件写到上述主题中。

$ kafka-console-producer --topic local-events --bootstrap-server localhost:9092

启动Kafka消费者(在终端4)并从上述主题中读取事件。

$ kafka-console-consumer --topic local-events --from-beginning --bootstrap-server localhost:9092

如果你能够在本地机器上无缝地生产和消费事件,这意味着上述设置是成功的,我们可以继续前进。

将本地机器连接到Azure VM以交换Kafka消息

通过创建入站安全规则,在Azure VM上打开9092端口。这可以通过Azure门户在VM的网络设置下完成。

转到本地机器上的/usr/local/etc/kafka/server.properties文件。取消注释并更新广告监听器。添加Azure VM的公共IP地址来代替你的.host.name。

advertised.listeners=PLAINTEXT://your.host.name:9092)

在本地机器上重新启动ZooKeeper服务(在终端1)。

$ zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties

在本地机器上重新启动Kafka代理服务(在终端2)。

$ kafka-server-start /usr/local/etc/kafka/server.properties

重启Kafka生产者(在终端3),但这次要把事件写入Azure VM上的Kafka主题,而不是本地Kafka主题。另外,使用Azure VM的公共IP而不是本地主机。

$ kafka-console-producer --topic azure-events --bootstrap-server <Azure VM Public IP>:9092

重新启动Kafka消费者(在终端4),但这次要从Azure VM上的Kafka主题而不是本地Kafka主题中读取事件。同时,使用Azure VM的公共IP,而不是localhost。

$ kafka-console-consumer --topic azure-events --from-beginning --bootstrap-server <Azure VM Public IP>:9092

确保ZooKeeper和Kafka代理服务仍在Azure VM上照常运行。如果你能够无缝地生产和消费事件,这意味着上述设置是成功的。

这样我们就到了本文的结尾。虽然这里考虑了带有Ubuntu服务器的Azure虚拟机和带有macOS的本地机器,但类似的练习也可以在Azure虚拟机上使用任何其他Linux风味,在本地机器上使用Windows操作系统。在这种情况下,命令会有一些不同。