业务平台间通过kafka方式实现数据交互

业务平台数据交互

场景

在很多场景下,我们的系统平台都会与其它业务平台进行一些数据的交互同步,比如传统制造业的设备数据,常常需要同步数据给下层业务平台进行使用,那么一般是在什么时间进行同步?以什么样的方式进行同步呢?会存在什么样的问题?

时间

一般是增量的时候实时推送,比如设备的新增、修改、删除。

方式

采用kafka消息中间件进行数据的交互同步,在设备进行增量操作的时候,给设备数据添加一个操作标识位operateType,比如新增为ADD,修改为Modify,删除为DELETE。每当执行增量操作的时候就把数据放入kafka消息队列中,让下层业务平台进行实时消费。

问题

一、中途可能会出现消息丢失的问题
做一个补偿机制
1.kafka可以设置设置重试次数,可以设置3次,3次都失败的情况下可以把失败消息放入本地消息表,用定时任务轮询消息表, 重新推送到kafka。
2.如果数据变动量比较大有必要的话定时做一个全量的推送,定时时间一般放在凌晨。
3.数据量变化较小的情况下,可以在前端加个选择设备进行推送按钮,其实跟全量推送一样,只不过是加个过滤。如果选择的推送数据较多的话,后端同步处理的情况下,会导致前端页面等待时间较长,所以后端在推送数据最好用多线程异步处理,前端点击推送按钮直接显示推送成功。
另一个问题出现,从用户角度前端直接显示成功,但是后端其实还在执行推送数据,用户是无法感知的,用户可能再次或多次点击手动推送,会给系统造成压力,甚至崩溃。处理方法是redis缓存加入判断key,进入推送方法前加key,推送方法完成后释放key。最好不要用全局变量做为判断条件,如果分布式的话,全局变量无法共享传递。

二、推送数据没进入kafka
1.检查topic名称是否正确
2.kafka默认单条消息最大1M
(1)如何扩大单条信息长度参考博客:kafka单条消息过大解决方法
(2)可以进行分批发送,例如每100条进行发送

public void inBatchesSend(List<Device> devList) {
    // 每批次数据记录数量
    int limitSize = 100;
    //判断是否有必要分批
    if (limitSize < devList.size()) {
        //当前数据按限制条数可分为多少批次
        int batchNum= devList.size() / limitSize ;
        List<Device> batchList ;
        for (int i = 0; i < batchNum; i++) {
            // 截取批次长度的list
            batchList = devList.subList(0, limitSize );
            // 异步发送数据
            sendKafka(batchList );
            // 去除已经处理的部分 (Arrays.asList()方式生成的数据不能进行此修改操作,会报错)
            batchList .clear();
        }
        // 获取最后一次截取后的剩余列表数据
        if (!devList.isEmpty()) {
            // 异步发送数据
             sendKafka(devList);
        }
    } else {
          // 异步发送数据
           sendKafka(devList);
    }
}

扩展:
1.kafka可视化工具——kafka Tool
推荐博客:kafka可视化客户端工具(Kafka Tool)的基本使用
2.定时任务——xxl-job
推荐博客:定时任务调度解析之xxl-job

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 仓库管理系统可以通过使用Kafka实现应用解耦。Kafka是一种高吞吐量、分布式流处理系统,可以作为一个中件来处理仓库管理系统中不同应用数据流。例如,仓库系统的收货组件可以将收货信息写入Kafka,然后入库组件从Kafka中读取信息并进行入库操作,两个组件之没有直接的依赖关系,这样就可以实现应用解耦。 ### 回答2: 仓库管理系统是一个涉及到多个模块和业务流程的复杂系统,其中的各个模块之需要进行数据的传递和交互。使用kafka作为消息中件可以有效地解耦应用,提高系统的稳定性和扩展性。 首先,kafka是一个高性能、可扩展的分布式发布订阅消息系统。它采用了消息队列的方式,将生产者产生的消息发布到不同的主题(topic),然后由消费者订阅相应的主题进行消费。 在仓库管理系统中,例如订单模块、库存模块、物流模块等,各个模块之需要进行数据的传递和同步。通过将消息发送到kafka的对应主题上,其他模块可以订阅相应的主题,实现数据的即时传递和交互。 其次,kafka采用了发布订阅的方式,可以实现一对多的消息传递。在仓库管理系统中,比如订单模块需要将订单状态的更新通知给库存模块和物流模块,通过将消息发送到对应的主题上,这些模块都可以实时获取到相关的消息,进行相应的处理。 此外,kafka还具备高可靠性和消息持久化的特点。它将消息以日志形式存储,即使在消费者处理异常或重启的情况下,消费者仍然可以从上一次消费的位置继续消费消息,确保消息不会丢失。 最后,kafka支持分布式部署,并且可以通过增加和扩展broker来提高系统的吞吐量和容量。这对于仓库管理系统来说尤为重要,因为随着业务的增长,系统需要处理的消息量也会不断增加,使用kafka可以轻松地实现系统的横向扩展,提高系统的处理能力和性能。 综上所述,仓库管理系统使用kafka实现应用解耦可以提高系统的稳定性和可扩展性。通过将各个模块之数据交互和通知通过消息队列进行传递,可以减少模块之的直接依赖,提高系统的灵活性和可维护性。 ### 回答3: 仓库管理系统是一个复杂的系统,涉及到多个模块和功能。为了提高系统的可扩展性和可维护性,可以使用消息队列的方式实现模块的解耦。而kafka作为一种高性能、可靠的消息队列系统,可以很好地满足这一需求。 首先,kafka具备高吞吐量和低延迟的特点。仓库管理系统中可能会涉及到大量的数据传输和处理,包括库存变更、订单状态更新等,如果使用传统的同步方式,各个模块之可能需要等待对方的响应才能继续执行。而通过将相关操作封装成消息,可以让产生消息的模块不再关心消息的消费者,从而实现解耦,并且利用kafka高吞吐量的特性能够快速处理和传递消息,提高系统的响应速度。 其次,kafka具备可靠性的特点。仓库管理系统中的消息可能因为网络问题、宕机等原因而丢失,而且消息的处理应满足顺序性要求。通过使用kafka的持久化和副本机制,可以保证消息在传输过程中不会丢失,并且支持副本机制确保消息的备份,从而能够在系统故障或者宕机情况下保证消息的可靠性和连续性。 最后,kafka具备良好的可扩展性。仓库管理系统在运行过程中可能需要根据业务需求进行扩展,例如增加新的模块或者对原有模块进行升级。通过使用kafka,可以将新的模块或者功能作为独立的消费者来消费特定的消息,极大地方便了系统的扩展和维护。 综上所述,仓库管理系统使用kafka实现应用解耦,不仅可以提高系统的可扩展性和可维护性,而且还能够实现高吞吐量、低延迟、可靠性和良好的可扩展性,从而提升系统的性能和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值