You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于配置将数据存入DB或Kafka?对中介者模式存疑

基于配置切换DB/Kafka存储的实现方案

一、更适配的策略模式实现

你的场景本质是根据配置选择不同的存储行为,策略模式比中介者模式更直接、易维护,先给这个实用方案:

步骤1:定义统一存储接口

先抽象出存储行为的标准,不管存DB还是Kafka都要实现这个接口:

public interface DataStorage {
    void save(Object data);
}

步骤2:实现具体存储逻辑

分别写DB和Kafka的实现类,各自负责自己的存储细节:

// DB存储实现
public class DbStorage implements DataStorage {
    @Override
    public void save(Object data) {
        // 这里写实际的DB操作,比如MyBatis/JDBC插入
        System.out.println("数据存入DB: " + data.toString());
    }
}

// Kafka存储实现
public class KafkaStorage implements DataStorage {
    @Override
    public void save(Object data) {
        // 这里写Kafka生产者发送逻辑,比如创建ProducerRecord发送
        System.out.println("数据存入Kafka: " + data.toString());
    }
}

步骤3:配置驱动的策略工厂

用工厂类根据配置值返回对应的存储实例:

import java.util.Map;

public class StorageFactory {
    // 预存所有存储策略
    private static final Map<String, DataStorage> STORAGE_MAP = Map.of(
        "1", new DbStorage(),
        "0", new KafkaStorage()
    );

    // 根据配置获取存储实例,默认返回Kafka
    public static DataStorage getStorage(String dbConfig) {
        return STORAGE_MAP.getOrDefault(dbConfig, new KafkaStorage());
    }
}

步骤4:业务代码调用

业务层只需要传入数据和配置,不需要关心底层存储逻辑:

public class BusinessHandler {
    public void handleData(Object data, String dbConfig) {
        // 先做业务处理,比如数据校验、转换
        DataStorage storage = StorageFactory.getStorage(dbConfig);
        storage.save(data);
    }
}

二、中介者模式实现方案

如果一定要用中介者模式(适合多组件交互复杂的场景),可以把配置、存储实例都交给中介者统一协调:

步骤1:定义中介者接口

中介者负责协调存储行为:

public interface StorageMediator {
    void saveData(Object data);
}

步骤2:实现配置驱动的中介者

中介者内部持有配置和两种存储实例,根据配置决定用哪个:

public class ConfigMediator implements StorageMediator {
    private final String dbConfig;
    private final DataStorage dbStorage;
    private final DataStorage kafkaStorage;

    public ConfigMediator(String dbConfig) {
        this.dbConfig = dbConfig;
        this.dbStorage = new DbStorage();
        this.kafkaStorage = new KafkaStorage();
    }

    @Override
    public void saveData(Object data) {
        if ("1".equals(dbConfig)) {
            dbStorage.save(data);
        } else {
            kafkaStorage.save(data);
        }
    }
}

步骤3:业务层调用

业务层通过中介者完成存储,不需要直接接触存储实现:

public class BusinessHandler {
    public void handleData(Object data, String dbConfig) {
        StorageMediator mediator = new ConfigMediator(dbConfig);
        mediator.saveData(data);
    }
}

三、额外建议

  • 配置可以从配置中心(比如Nacos、Apollo)动态获取,不需要重启服务,只要在工厂/中介者里实时读取最新值就行
  • 实际项目里可以用Spring的依赖注入代替硬编码new对象,比如把DbStorage和KafkaStorage注册成Bean,工厂直接注入
  • 可以加异常降级逻辑,比如DB存储失败时自动切换到Kafka,保证数据不丢失

内容的提问来源于stack exchange,提问作者Rashhh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:42:45