Go 多个副本访问kubernetes中的缓存

Go 多个副本访问kubernetes中的缓存,go,kubernetes,microservices,prometheus,Go,Kubernetes,Microservices,Prometheus,普罗米修斯日志记录的一个统计数据是服务调用的持续时间,但我想测量同一服务的多个调用的时间 所以我想创建一个字符串到时间的映射 type SomeService struct { durations map[string]time.Time } 在第一次输入时,将存储该帐户id的当前时间 durations[GetId()] = time.Now() 然后在最后…在另一个调用中…存储总时间 startTime := c.durations[id] duration, _ := c.du

普罗米修斯日志记录的一个统计数据是服务调用的持续时间,但我想测量同一服务的多个调用的时间

所以我想创建一个字符串到时间的映射

type SomeService struct {
    durations map[string]time.Time
}
在第一次输入时,将存储该帐户id的当前时间

durations[GetId()] = time.Now()
然后在最后…在另一个调用中…存储总时间

startTime := c.durations[id]
duration, _ := c.durationStat.GetMetricWith(prometheus.Labels{"type": duration})
duration.Set(time.Now().Sub(startTime).Seconds())
delete(c.durations, id)
当只有一个复制副本,但它在Kubernetes集群中发生故障时,这种方法是有效的,对吗?下一个呼叫可能来自另一个端点?如何在微服务中缓存值,以便每个副本都可以访问这些值?

最终发现:

您可以将服务配置为始终具有相同的ip地址 通过将service.spec.sessionAffinity设置为“ClientIP”相同的pod 默认值为“无”

这样您就可以安全地在内存中缓存简单的值

终于找到了这个:

您可以将服务配置为始终具有相同的ip地址 通过将service.spec.sessionAffinity设置为“ClientIP”相同的pod 默认值为“无”


这样您就可以安全地在内存中缓存简单的值

你能不能也加上你的实现中出现的错误?我被告知你不能像这样缓存,没有错误只是在寻找一个好的方法来轻松地做到这一点我不确定你在这里缓存什么,因为这是我第一次看到有人使用普罗米修斯来收集度量以外的东西。处理多个实例之间缓存的一般问题是数据一致性,因为同一缓存键的数据可以在不同的实例之间重新写入。所谓“下一个调用可能会在另一个端点上进行”是指对“启动服务调用”和“结束服务调用”有单独的请求吗?或者简单地说,您可能会收到由不同副本处理的不同“服务调用”(每个“服务调用”包括“启动服务调用”、有用的工作和“结束服务调用”)?能否请您也添加实现时出现的错误?我被告知您不能这样缓存,没有错误,只是想找到一个好的方法来轻松实现。我不确定你在这里缓存了什么,因为这是我第一次看到有人使用普罗米修斯来收集度量以外的东西。处理多个实例之间缓存的一般问题是数据一致性,因为同一缓存键的数据可以在不同的实例之间重新写入。所谓“下一个调用可能会在另一个端点上进行”是指对“启动服务调用”和“结束服务调用”有单独的请求吗?或者简单地说,您可能会得到由不同副本处理的不同“服务调用”(每个由“启动服务调用”、有用工作和“结束服务调用”组成)?是否需要跨多个API请求跟踪这些计时?如果是的话,那么sessionAffinity只会起到很大的作用。pod来来去去去(尤其是在大量放大和缩小时),无法保证记录开始时间的pod在生命周期的后期仍然存在。是否需要跨多个API请求跟踪这些计时?如果是的话,那么sessionAffinity只会起到很大的作用。吊舱来来去去去(尤其是在大量放大和缩小的情况下),无法保证记录开始时间的吊舱在生命周期的后期仍然存在。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  sessionAffinity: ClientIP
  selector:
    app: MyApp