我很困惑 - 在微服务之间以异步方式传递用户身份(授权信息)的最佳方式是什么?
假设我已经有了处理身份验证和颁发 JWT 令牌的入口点(api 网关)。然后用户使用此令牌调用某个 API 端点。到此为止,一切都清楚了。现在 - 此端点需要与另一个微服务通信。该微服务必须获得授权信息(角色等)。此外 - 该通道是异步的(JMS/Kafka),这意味着处理可能会延迟......
我也在考虑其他情况:我们有两个服务 A 和 B。它们都公开了可能被外部用户访问的 API(JWT 令牌身份验证),但它们也需要异步协作(通过 JMS)。他们都需要用户身份上下文。再次 - 如何通过它?
我可以:
他们对我都有缺点,我找不到通用的解决方案......
- 编辑
考虑案例:有产品目录服务和订购服务。两者都公开公共 API。用户下订单,它排队等待处理。第一步是验证产品是否正常以及是否允许用户订购。处理可能会调用产品目录服务,但必须传递用户上下文。这就是我要说的部分。
我有两个流:
[topicA] -> processingA -> [topicB] -> processingB -> [topicC]
通过登录我的应用程序,我注意到在将输出从 processingA 发送到 topicB 和从 topicB 为 processingB 挑选消息之间,每次需要超过 100 毫秒(而不是 150 毫秒)。它可能不多,但它会累积,最后相当简单的级联处理几乎需要秒。
我可以调整 kafka 以使这些延迟尽可能接近零吗?哪些配置参数对这些延迟有影响?
我主要是默认配置。是 commit.interval.ms 导致延迟吗?我已经将它从更高的默认值更改了...
StreamsConfig values:
application.id = app
application.server =
bootstrap.servers = [localhost:9092]
buffered.records.per.partition = 1000
cache.max.bytes.buffering = 10485760
client.id =
commit.interval.ms = 100
connections.max.idle.ms = 540000
default.deserialization.exception.handler = class org.apache.kafka.streams.errors.LogAndContinueExceptionHandler
default.key.serde = class org.apache.kafka.common.serialization.Serdes$StringSerde
default.production.exception.handler = class org.apache.kafka.streams.errors.DefaultProductionExceptionHandler
default.timestamp.extractor = class org.apache.kafka.streams.processor.FailOnInvalidTimestamp
default.value.serde = class org.apache.kafka.common.serialization.Serdes$StringSerde
metadata.max.age.ms = 300000
metric.reporters = []
metrics.num.samples …Run Code Online (Sandbox Code Playgroud) 我们设计了一个多租户系统(假设有数百个租户,而不是数千个)。没有共享数据。数据库是PostgreSQL。为每个租户或架构创建一个单独的数据库是否更好?
优缺点都有什么?对文件系统、数据库引擎表/视图(如锁、对象权限等)有何影响?在多模式解决方案中它们会更大吗?单独的数据库应该更容易备份/恢复。
我知道有很多类似的问题,但大多数都与共享数据的情况有关,这是多个数据库的主要缺点,而我们没有这样的要求。
database postgresql database-design multi-tenant database-schema