kafka-踩坑

博客主要介绍了在阿里云服务器上搭建独立Kafka环境时遇到的问题,如通过程序访问需在kafka server.properties中设置内容;还提到命令生产和消费时,创建生产者设置的IP必须与kafka配置文件中的一致,否则会报错。

    欢迎大家关注我的公众号,有问题可以及时和我交流。
image.png

1 环境搭建

我是学习,只在阿里云服务器上搭建了一个独立的kafka,在搭建环境的时候遇到的一些坑如下:

kafka server.properties 配置文件中的:listeners=PLAINTEXT://IP:9092
这里我尝试了 IP设置成外网和localhost,就是通过IP访问阿里云的外网IP,然后运行结果会报错,起不来kafka。
查阅资料说的是设置成本机的IP, 使用ifconfig查看阿里云的IP,然后设置完成之后即可重新启动。

如果需要通过程序进行访问的,仅仅设置这两个还是不够的,还需要在kafka server.properties中设置如下内容。

host.name=阿里云内网IP
advertised.host.name=阿里云外网IP

advertised.listeners=PLAINTEXT://阿里云外网IP:9092

2 命令生产和消费

创建topic:./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
创建生产者:./kafka-console-producer.sh --broker-list IP(kafka设置的IP):9092 --topic test
创建消费者:./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning

这里有一个坑就是创建生产者的时候所设置的IP,也必须是kafka配置文件中设置的IP,否则报错:

[2019-07-09 13:11:05,594] WARN [Producer clientId=console-producer] Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

    欢迎大家关注我的公众号,有问题可以及时和我交流。
image.png

### Flask与Kafka集成常见问题及解决方案 #### 1. Kafka依赖库安装失败 当尝试在Flask应用中引入`kafka-python`或其他Kafka客户端库时,可能会到包安装失败的情况。这通常是因为环境配置不当或缺少必要的编译工具。 解决方法是在虚拟环境中执行安装命令,并确保操作系统已安装Python开发文件以及构建必需的软件包[^1]: ```bash pip install kafka-python ``` 如果仍然无法成功安装,则考虑升级Pip版本或将特定版本号固定下来再试一次。 #### 2. 连接超时错误 创建生产者或消费者实例时发生连接超时异常,表明应用程序未能及时建立到Kafka集群的有效链接。可能的原因有网络延迟过高、目标服务器地址不正确或是防火墙阻止了通信端口。 建议先验证Broker列表中的主机名和端口号设置无误;接着确认本地机器能够正常访问远程服务;最后调整socket_timeout_ms参数值来增加等待时间窗口: ```python from kafka import KafkaProducer producer = KafkaProducer( bootstrap_servers=['localhost:9092'], socket_timeout_ms=30*1000 # 设置为30秒 ) ``` #### 3. 数据序列化/反序列化格式不符 向主题发送消息前需指定合适的键值编码方式,默认情况下采用字符串形式表示。然而实际场景下经常需要用到JSON对象或者其他自定义结构体作为负载内容,在这种情形下就需要额外处理数据转换逻辑。 可以利用json.dumps()函数将字典转成合法的JSON串并附带相应的内容类型头信息传递给send()接口调用: ```python import json message_value = {"key": "value"} future_record_metadata = producer.send('my-topic', value=json.dumps(message_value).encode()) ``` 对于消费端而言则相反,接收后应立即解码恢复原始形态以便后续业务流程继续运作下去: ```python for message in consumer: decoded_message = json.loads(message.value.decode()) print(decoded_message["key"]) ``` #### 4. 并发性能瓶颈 随着并发请求量增大,单线程模式下的I/O密集型操作容易成为整个系统的效率短板所在。此时可借助多进程或多线程技术实现异步非阻塞式的批量提交机制从而提高吞吐率表现。 通过继承ThreadingMixIn类来自定义HTTPServer类即可轻松达成目的: ```python from http.server import HTTPServer, BaseHTTPRequestHandler from threading import Thread from concurrent.futures.thread import ThreadPoolExecutor class SimpleHttpServer(HTTPServer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.executor = ThreadPoolExecutor(max_workers=8) if __name__ == '__main__': server_address = ('', 8000) handler_class = MyRequestHandler with SimpleHttpServer(server_address, handler_class) as httpd: threads = [] while True: request, client_address = httpd.get_request() thread = Thread(target=httpd.process_request_thread, args=(request, client_address)) thread.start() threads.append(thread) if len(threads) >= 8: for t in threads[:]: t.join(timeout=0.1) if not t.is_alive(): threads.remove(t) ``` 当然也可以直接选用gevent等第三方协程框架进一步简化代码复杂度的同时获得更好的资源利用率效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值