doujiang24 / lua-resty-kafka

Lua kafka client driver for the Openresty based on the cosocket API
BSD 3-Clause "New" or "Revised" License
802 stars 275 forks source link

当前项目存在的问题 #106

Open lsasta opened 3 years ago

lsasta commented 3 years ago
hongliang5316 commented 3 years ago

@lsasta 使用异步的方式更多的是用于提高服务端的性能, 同时间接也提升了kafka的写入效率, 如果对数据量很大且性能要求比较高又允许极端异常情况下数据可以有丢失的场景可以使用, 如果不允许数据丢失建议用同步, 另外如果kafka故障建议业务方可以做适当的降级或者重试逻辑来解决。

superlins commented 3 years ago
  • 使用异步的方式将数据发送到kafka,数据会先存储在内存,由定时器每隔固定时间将数据flush到kafka,这会存在一个问题,当进程意外退出的时候,会丢失内存中的数据。比如,时间间隔是1s,那么就会丢失上一秒的数据。

  • 使用异步的方式还存在另外的问题,当kafka挂掉之后,缓存被写满之后没有相应的解决办法,也会导致数据丢失。

  • 使用同步的方式,能够解决上面数据可能丢失的问题,但是又会存在新的问题,比如当kafka挂掉的时候,客户端的请求因为是同步的,这样会导致客户端的请求失败,这样的做法耦合太高,不应该因为kafka挂掉而导致客户端请求失败。

这个问题其实和lua-kafka关系不大,可以查看下apache-kafka关于生产者同步与异步的说明,具体可根据业务场景择优选择……另kafka生产环境应尽可能保证可用性,对于应用层楼上也说了,降级与熔断以及系统流量的合理分配都是可以考虑的方面