Kafka+redis分布式锁结合使用心得总结

#kafka部分

@KafkaListener(topics = "#{'{vsmart_alert_detection_tms_send_message_topic}'.split(',')}", groupId = "{vsmart.alert.detection.consumer.group}")

public void vsmartAlertDetectionTmsSendMessage(ConsumerRecord<?, ?> record, Acknowledgment ack, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {

doSendMessage(record,ack);

}

private void doSendMessage(ConsumerRecord<?, ?> record, Acknowledgment ack) {

Optional message = Optional.ofNullable(record.value());

String key = record.topic() + "-" + record.partition() + "-offset:" + record.offset();

if (RedisUtils.isExistsKey(key)) {

ack.acknowledge();

return;

}

try {

if (message.isPresent() && (record.timestamp() > (System.currentTimeMillis() - kafkaConsumerDelayTime))) {

JSONObject msg = JSONObject.parseObject(record.value().toString());

msg.put(VSMART_KAFKA_MSG_POSITION_INFO, key);

//具体操作

}

}catch (Exception e){

}finally {

ack.acknowledge();

}

}

#redis部分

public Boolean handler(JSONObject msg) {

//解析

Boolean isOk = jsonToDetectionInfos(msg);

if (!isOk) {

return false;

}

//加锁 associatedKey()

String lockKey = associatedKey();

if (StrUtil.isEmpty(lockKey)) {

return false;

}

RLock lock = SpringUtils.getBean(RedissonClient.class).getLock(lockKey);

//锁的时间 根据业务需要进行调整

try {

boolean flag_2 = lock.tryLock(10, 300, TimeUnit.SECONDS);

if (flag_2) {

//加锁后执行前判断是否已经处理过kafka中相同位置的信息了

if (ObjectUtil.isNotNull(msg) &&

ObjectUtil.isNotNull(msg.get(VSMART_KAFKA_MSG_POSITION_INFO)) &&

RedisUtils.isExistsKey(msg.getString(VSMART_KAFKA_MSG_POSITION_INFO))) {

return false;

}

//具体业务操作

//...

return true;

} else {

detectionRuleBo.getLogText().append(StrUtil.format("{}-获取锁失败;", detectionRuleBo.getName())).append("<br>");

return false;

}

} catch (Exception e) {

} finally {

///释放锁

if (null != lock && lock.isHeldByCurrentThread()) {

if (ObjectUtil.isNotNull(msg) &&

ObjectUtil.isNotNull(msg.get(VSMART_KAFKA_MSG_POSITION_INFO))) {

RedisUtils.setCacheStrExpire(msg.getString(VSMART_KAFKA_MSG_POSITION_INFO), msg.getString(VSMART_KAFKA_MSG_POSITION_INFO), 60 * 60);

}

//解锁

lock.unlock();

}

return true;

}

}

相关推荐
深圳蔓延科技12 小时前
Kafka的高性能之路
后端·kafka
努力的小郑18 小时前
从一次分表实践谈起:我们真的需要复杂的分布式ID吗?
分布式·后端·面试
AAA修煤气灶刘哥1 天前
别让Redis「歪脖子」!一次搞定数据倾斜与请求倾斜的捉妖记
redis·分布式·后端
阿里云云原生2 天前
嘉银科技基于阿里云 Kafka Serverless 提升业务弹性能力,节省成本超过 20%
kafka·serverless
christine-rr2 天前
linux常用命令(4)——压缩命令
linux·服务器·redis
Aomnitrix2 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
程序消消乐2 天前
Kafka 入门指南:从 0 到 1 构建你的 Kafka 知识基础入门体系
分布式·kafka
智能化咨询2 天前
Kafka架构:构建高吞吐量分布式消息系统的艺术——进阶优化与行业实践
分布式·架构·kafka
Chasing__Dreams2 天前
kafka--基础知识点--5.2--最多一次、至少一次、精确一次
分布式·kafka