1

我有一些服务。我需要从弹性搜索返回数据(如果可用)或从数据库返回:

@Service
class DefaulUserService implements UserService {

    private final DbDao dbDao;
    private final ElasticsearchDao elasticsearchDao;

    DefaultDoctorService(DbDao dbDao, ElasticsearchDao elasticsearchDao) {
        this.dbDao= dbDao;
        this.elasticsearchDao= elasticsearchDao;
    }

    @Override
    public List<User> findAll() {
       if(elasticsearch is down){
             return dbDao.findAll();
        } else {
             return elasticsearchDao.findAll();
       }
    }
}

如何检查elasticsearch is down我的服务中的条件?

4

2 回答 2

2

如果它真的宕机了,elasticsearchDao.findAll();肯定应该抛出一个异常,对吧?

@Service
class DefaultUserService implements UserService {

    private final DbDao dbDao;
    private final ElasticsearchDao elasticsearchDao;

    DefaultDoctorService(DbDao dbDao, ElasticsearchDao elasticsearchDao) {
        this.dbDao= dbDao;
        this.elasticsearchDao= elasticsearchDao;
    }

    @Override
    public List<User> findAll() {
        try {
            return elasticsearchDao.findAll();
        }
        catch(Exception e) {
            return dbDao.findAll();
        }
    }
}

显然,您必须选择一种更合适的异常类型来捕获。

于 2020-11-30T09:31:05.030 回答
0

您可以简单地使用ES 集群健康 API并检查它。它不仅会检查 ES 的正常运行时间,而且可以使用相同的 API 仅获取指定数据流和索引的健康状态。

几个重要的状态

  1. 红色:- 一个或多个主分片丢失。
  2. Yeloow:- 一个或多个副本碎片丢失。
  3. 绿色:- 一切都很好:)
于 2020-11-30T09:24:47.027 回答