让我们考虑一种情况,其中多个服务依赖的数据可以随时更改,并且应该在每个微服务中大致同时更新 - 例如,有一个受支持的语言列表或一些通用策略可能有一天会更改并影响许多人立即服务。
我能想到的一个解决方案是拥有另一个可以保存该数据的微服务,并且任何需要当前状态的服务都可以请求它。缺点是这些数据变化不是很频繁,通过 HTTP 请求并不便宜,而且这个比方说全局注册表服务有很多流量。由于它不经常更改,因此许多服务可能只是缓存数据(以便不必每次都请求数据),并且在配置更改时无法足够快地响应更改。
另一种解决方案可能是将此类配置外部化 - 例如,在 AWS 中,S3 上可能有一些可供其他人使用的配置文件。这里的缺点是(据我所知)无法跟踪此类文件中的更改,并且无法添加一些逻辑来验证配置中更改的值是否正确(没有拼写错误等), ETC。
所以我的问题是如何在微服务世界中处理全局配置/注册表,以便几乎没有 HTTP 开销,您可以在许多服务中审核更改并同时引入更改?
我开始玩Angular 6和Firebase。我想使用Hacker News API来显示提要(内容)。
我想返回一个Thing类数组的可观察对象。首先,我需要一个供稿ID数组,因此我打电话给Firebase来获取它们。然后,我想获取每个已有ID的提要,并将其作为可观察到的提要数组返回。
到目前为止,我的代码是这样的:
getThings(limit: number): Observable<any> {
return this.db.list('/v0/beststories', ref => ref.limitToFirst(limit).orderByKey())
.valueChanges() // returns an Observable of IDs
.pipe(
flatMap(itemIds => {
if (itemIds.length > 0) {
let sources = itemIds.map(itemId => defer(() => {
let pathOrRef = '/v0/item/' + itemId;
return this.db.object(pathOrRef).valueChanges();
}));
// sources are the array of Observables
return forkJoin(sources);
} else {
return Observable.create([]);
}
})
);
}
Run Code Online (Sandbox Code Playgroud)
我以为从数组来的flatMapping是解决方案,但是我得到了You provided an invalid object where a stream was expected. You can provide …