Public API 架构
Public API Architecture
我一直致力于数据透明化项目,其中一项举措是使用 APIs 提供对我们数据的访问。到目前为止,我们已经决定使用 API Manager 平台来公开和管理所有 API。 API网关(由平台提供)将控制所有请求。
我们现在的主要疑惑是,public API 应该如何构造?它的架构应该如何规划?例如(非常简单的例子):
(1)复制生产数据库:
(2)不复制生产数据库:
情况(1)(复制),我该如何处理实时数据?例如:巴士位置?
情况(2),我可能有什么样的顾虑? (性能、安全性...)
我一直在努力寻找著名的 public API 案例(例如推特 API),但我还没有找到关于 public 的任何信息api 体系结构和实现。
我觉得应该先建立几个条件
1。您的作品没有(不应该)与您的 API 分开。
大多数公司都在使用他们有一种或另一种方式的外部 API。他们为什么不呢?它可靠/受到监控/分布式/负载平衡,因此将是一项很好的服务。他们可能有一些 API 的内部版本用于测试/发布环目的,但主要是他们的前端将构建在您可以调用的同一堆栈上。所以你不应该考虑 API 完全独立于你的作品。在这个时代,它真的只是系统的一部分。
2。数据库复制
我觉得这两张图都不对。顶部的看起来不正确,因为您正在明确地从另一个实例读取,而底部的看起来不正确,因为您没有复制。现在复制是一个非常冗长的话题 - 简短的教训是你绝对应该有复制。检查这个link以查看复制数据的不同类型的一致性:https://en.wikipedia.org/wiki/Consistency_model
您将不得不在这里做出一些权衡,但作为示例取决于您的负载和负载模式;你可以复制你的数据库,允许你的读取是多区域的,写入是单区域的,你的业务层——这也支持你的 API 将部署到多个区域。 (前提是你有足够的流量)
3。设计问题
这有一些设计问题,但让我们先解决您的问题。
In case (1) (Replicating), how may I deal with real time data? For example: Bus Location?
- 检查不同的一致性类型,select最适合您的服务的类型。
- 您理想的实时体验是怎样的?这是一个地图应用程序,您在其中将公交车位置通知推送到设备/或者您是否希望用户连接并查询以查看下一班公交车的时间?根据您的需要,您可能在这里有不同的设计决策。 (我也非常怀疑您的总线位置将来自数据库) 但是它们都不会真正影响复制,一致性 + read/write 比率和总体负载/负载模式在这种情况下更为重要。
In case (2), what kind of concerns I may have? (performance, security...)
您不应该使用案例 2。
我认为您应该首先确定用户和系统的要求。仅通过这些图表进行设计也非常困难,因为我们无法真正知道我们是在为本地区域还是为全球系统设计该系统。理想情况下,您会为所有内容提供冗余(因此多个服务器服务于网络流量/多个数据库/多个 CDN 用于您的静态内容等),因此您将获得更高质量的服务和更小的失败机会。有时甚至整个云服务区域都会因自然灾害而宕机/因此跨不同区域进行复制是个好主意,但您的系统可能并不真正需要它。在所有情况下,您的 public API 不应与您的作品分开。
我一直致力于数据透明化项目,其中一项举措是使用 APIs 提供对我们数据的访问。到目前为止,我们已经决定使用 API Manager 平台来公开和管理所有 API。 API网关(由平台提供)将控制所有请求。
我们现在的主要疑惑是,public API 应该如何构造?它的架构应该如何规划?例如(非常简单的例子):
(1)复制生产数据库:
(2)不复制生产数据库:
情况(1)(复制),我该如何处理实时数据?例如:巴士位置?
情况(2),我可能有什么样的顾虑? (性能、安全性...)
我一直在努力寻找著名的 public API 案例(例如推特 API),但我还没有找到关于 public 的任何信息api 体系结构和实现。
我觉得应该先建立几个条件
1。您的作品没有(不应该)与您的 API 分开。
大多数公司都在使用他们有一种或另一种方式的外部 API。他们为什么不呢?它可靠/受到监控/分布式/负载平衡,因此将是一项很好的服务。他们可能有一些 API 的内部版本用于测试/发布环目的,但主要是他们的前端将构建在您可以调用的同一堆栈上。所以你不应该考虑 API 完全独立于你的作品。在这个时代,它真的只是系统的一部分。
2。数据库复制
我觉得这两张图都不对。顶部的看起来不正确,因为您正在明确地从另一个实例读取,而底部的看起来不正确,因为您没有复制。现在复制是一个非常冗长的话题 - 简短的教训是你绝对应该有复制。检查这个link以查看复制数据的不同类型的一致性:https://en.wikipedia.org/wiki/Consistency_model 您将不得不在这里做出一些权衡,但作为示例取决于您的负载和负载模式;你可以复制你的数据库,允许你的读取是多区域的,写入是单区域的,你的业务层——这也支持你的 API 将部署到多个区域。 (前提是你有足够的流量)
3。设计问题
这有一些设计问题,但让我们先解决您的问题。
In case (1) (Replicating), how may I deal with real time data? For example: Bus Location?
- 检查不同的一致性类型,select最适合您的服务的类型。
- 您理想的实时体验是怎样的?这是一个地图应用程序,您在其中将公交车位置通知推送到设备/或者您是否希望用户连接并查询以查看下一班公交车的时间?根据您的需要,您可能在这里有不同的设计决策。 (我也非常怀疑您的总线位置将来自数据库) 但是它们都不会真正影响复制,一致性 + read/write 比率和总体负载/负载模式在这种情况下更为重要。
In case (2), what kind of concerns I may have? (performance, security...)
您不应该使用案例 2。
我认为您应该首先确定用户和系统的要求。仅通过这些图表进行设计也非常困难,因为我们无法真正知道我们是在为本地区域还是为全球系统设计该系统。理想情况下,您会为所有内容提供冗余(因此多个服务器服务于网络流量/多个数据库/多个 CDN 用于您的静态内容等),因此您将获得更高质量的服务和更小的失败机会。有时甚至整个云服务区域都会因自然灾害而宕机/因此跨不同区域进行复制是个好主意,但您的系统可能并不真正需要它。在所有情况下,您的 public API 不应与您的作品分开。