小编Max*_*Max的帖子

Terraform 无法创建入口(找不到请求的资源 ingresses.extensions)

我在本地使用 minikube。以下是.tf我用来创建 kubernetes 集群的文件:

provider "kubernetes" {
  config_path = "~/.kube/config"
}

resource "kubernetes_namespace" "tfs" {
  metadata {
    name = "tfs" # terraform-sandbox
  }
}

resource "kubernetes_deployment" "golang_webapp" {
  metadata {
    name      = "golang-webapp"
    namespace = "tfs"
    labels = {
      app = "webapp"
    }
  }
  spec {
    replicas = 3
    selector {
      match_labels = {
        app = "webapp"
      }
    }
    template {
      metadata {
        labels = {
          app = "webapp"
        }
      }
      spec {
        container {
          image             = "golang-docker-example" …
Run Code Online (Sandbox Code Playgroud)

kubernetes terraform minikube

12
推荐指数
2
解决办法
1万
查看次数

使 POST 请求幂等

我一直在寻找一种方法来设计我的 API,使其具有幂等性,这意味着其中一些方法是为了使我的 POST 请求路由具有幂等性,我偶然发现了这篇文章。

(如果我理解的不对,请纠正我!)

其中对总体思路有很好的解释。但缺少的是他自己实施的一些例子。

有人问文章作者,他如何保证原子性?所以作者添加了一个代码示例。

本质上,在他的代码示例中有两种情况,

如果一切顺利的话流程:

  • 在数据库上打开一个事务,保存需要通过 POST 请求更改的数据
  • 在此事务中,执行所需的更改
  • 在 Redis 存储内设置Idempotency-key键和值,这是对客户端的响应
  • 设置该键的过期时间
  • 提交交易

如果代码内部出现问题,流程如下:

  • 并且函数流程内发生异常。
  • 执行事务回滚

注意,打开的事务是针对某个DB的,我们称他为A。但是,它与他也使用的redis存储无关,这意味着事务的回滚只会影响DB A。

因此,它涵盖了代码内部发生某些事情导致无法完成交易的情况。

但是,如果运行代码的机器在已经执行完Set expire time to that key并且即将运行事务提交的状态下崩溃,会发生什么情况?

在这种情况下,密钥将在 Redis 存储中可用,但事务尚未提交。这将导致这样的情况:服务确定所需的更改已经发生,但事实并非如此,机器在完成之前就发生了故障。

我需要以这样的方式设计API:如果redis中的数据更改或键和值的设置失败,它们都会回滚。

这个问题的解决办法是什么?

如何保证在一个数据库中更改所需数据的原子性,同时在redis中设置密钥和所需响应,如果其中任何一个失败,则将它们都回滚?(包括机器在操作过程中崩溃的情况)

请在回答时添加代码示例!我使用与本文中相同的技术(nodejs、redis、mongo - 用于数据本身)

谢谢 :)

rest post distributed http idempotent

8
推荐指数
1
解决办法
8956
查看次数

GCP 警报过滤器不会影响公开事件

我有一个警报,我已将其配置为在已完成状态而不是“错误”或“确定”的云函数的执行总和大于 0(按函数名称分组)时发送电子邮件。

我定义警报的方式是:

警报定义

二级聚合器是delta

问题是,一旦警报打开,过滤器看起来就不再重要了,并且警报保持打开状态,因为它看到云功能被触发并以任何状态结束(即使“确定”状态也保持打开状态)只要触发足够了)。

ATM 我能想到的唯一解决方案是定义一个基于日志的指标,该指标将自己计算,然后警报将基于该自定义指标而不是内置指标。

有什么我想念的吗?

编辑:

添加另一个图像以显示我认为可能存在的问题: 事件

从上图我们看到图表不会下降到 0 而是保持在 1,这不是其他正常事件的工作方式

google-cloud-platform google-cloud-logging google-cloud-functions google-cloud-monitoring

7
推荐指数
1
解决办法
142
查看次数

什么是聚合根?

不,这不是重复问题。我有很多关于这个主题的资料,但我仍然觉得我没有完全理解它。

这是我迄今为止所掌握的关于什么是聚合和聚合根的信息(来自多个来源,无论是文章、视频等......):

  • 聚合是多个值对象\实体引用和规则的集合。
  • 聚合始终是一个命令模型(旨在更改业务状态)。
  • 聚合代表单个工作单元(数据库 - 因为本质上更改将被持久化),这意味着它必须保持一致。
  • 聚合根是与外部世界的接口。
  • 聚合根必须在系统内具有全局唯一标识符
  • DDD 建议每个聚合根都有一个存储库
  • 聚合中的简单对象在其 AR(聚合根)不知道的情况下无法更改

考虑到所有这些,让我们进入我感到困惑的部分:

这个网站上它说

聚合根是与外部世界的接口。与聚合的所有交互都是通过聚合根进行的。因此,聚合根必须在系统内具有全局唯一标识符。存在于聚合中但不是聚合根的其他实体仅需要本地唯一标识符,即聚合内唯一的 Id。

但是,在这个示例中,我可以看到聚合根是由充当Transfer聚合的静态类和名为TransferedRegisteredAR 的内部静态函数实现的。

所以问题是:

  1. 如果该函数必须有一个全局唯一标识符,但实际上没有,原因是它是一个函数,那么该函数怎么可能是 AR?具有全局唯一标识符的是该函数产生的领域事件。
  2. 以下问题 - 聚合根在代码中看起来如何?这是事件吗?是返回的实体吗?是Aggregate类本身的功能吗?
  3. 如果函数返回的领域事件是 AR(如上所述,它必须具有全局唯一标识符),那么我们如何与这个聚合交互?第一篇文章明确指出,与聚合的所有交互都是由 AR 进行的,如果 AR 是一个事件,那么我们除了对其做出反应之外什么也做不了。
  4. 聚合有两个主要作用,这样说是否正确:
    • 根据收到的输入和了解的规则应用所需的更改
    • 返回需要从 AR 中保存的数据和/或需要在 AR 的领域事件中引发的数据

如果某些/全部错误,请在开始时纠正我的任何要点,如果我遗漏了任何要点,请随时添加更多!

感谢您澄清事情!

domain-driven-design aggregate aggregateroot

6
推荐指数
2
解决办法
3477
查看次数

将通用结构保存到redis

在编写 golang 网络服务器时,我不得不使用某种缓存,所以我选择了 redis。我需要某种采用任何结构并将其保存为 redis 作为值的函数。有什么方法可以做到这一点而不使用interface{}作为接收参数或重复自己太多并且仍然保持类型安全?

go redis

5
推荐指数
1
解决办法
7974
查看次数

本地运行 golang lambda 函数

我正在尝试开发一个必须与 S3 和 dynamoDB 一起使用的 lambda。问题是,因为我不熟悉 aws for go 的 SDK,所以我会有很多测试和尝试。每次我更改代码时,我都必须编译项目并将其上传到 aws。有什么办法可以在本地实现吗?通过某种配置让我从我的计算机本地调用 aws 服务?谢谢!

这主要与golang有关,其他语言如python可以直接在aws lambda函数页面上运行,并且node也cloud9支持。

go amazon-web-services aws-lambda

4
推荐指数
1
解决办法
1万
查看次数

返回一个可变对象

我对性能有疑问.如果我有一个案例,当我将一个可变对象传递给一个函数并且我对该对象进行更改时,我知道在python中它将更改该值,并且所有指针都将指向已更改的值.但是编写代码的正确方法是什么?我应该使用该return语句并重新分配指向函数输出的指针,以显示读取它正在被更改的代码的那个吗?

如果你预先指定一个指向它已经指向的同一个内存的指针,那么它对性能的影响有多大?

谢谢!

python python-3.x

1
推荐指数
2
解决办法
306
查看次数

json unmarshal不工作,但解码没有

我很难理解为什么下面使用unmarshal方法的代码不起作用,但几乎一样,我使用NewDecoder编写并且它可以找到.

package conf

import (
    "os"
    "io/ioutil"
    "encoding/json"
)

type Configuration struct {
    Agents []Agent `json:"agents"`
    IbmWmqFolder string `json:"ibmWmqFolder"`
}

type Agent struct {
    AgentName string `json:"agentName"`
    Folders []string `json:"folders"`
}

func LoadConfiguration() (configuration Configuration) {
    jsonFile, err := os.Open("config.json")
    if err != nil {
        panic(err)
    }
    defer jsonFile.Close()
    byteValue, _ := ioutil.ReadAll(jsonFile)
    json.Unmarshal(byteValue, configuration)
    return
}
Run Code Online (Sandbox Code Playgroud)

但是如果我做的都是一样的,而不是最后两行与byteValueunmarshal本身,但使用解码器,它的工作原理,

jsonParser := json.NewDecoder(jsonFile)
jsonParser.Decode(&configuration)
return
Run Code Online (Sandbox Code Playgroud)

谢谢!

json go

-1
推荐指数
1
解决办法
104
查看次数