小编ken*_*tor的帖子

将JSON Object数组转换为关联数组

假设我有2个JSON对象数组,如下所示:

资源:

[{
    "DefinitionId": 193041,
    "ResourceId": -2147290607,
    "AssetId": 193041
}, {
    "DefinitionId": 193042,
    "ResourceId": -2147290603,
    "AssetId": 193042
}]
Run Code Online (Sandbox Code Playgroud)

ResourceIds

[193041, 193041, 193041, 193042]
Run Code Online (Sandbox Code Playgroud)

用例:

我需要为每个ResourceId列出我的Resources JSONObject的详细信息.比如我要输出的AssetId每一个ResourceIdResourceIds.

我的计划:

我认为这将是一个完美的解决方案,以我的转换ResourcesJSON到一个关联数组,这样我就可以访问AssetId我的ResourceId"193041"是这样的:Resources[193041].AssetId.问题:我只能考虑使用长代码将上面的ResourcesJSON转换为关联的JSON对象.

问题:

如何将上述Resources JSON对象数组转换为以ResourceId为键的关联对象数组?

期望的Resources.json:

{
    "-2147290607": {
        "DefinitionId": 193041,
        "ResourceId": -2147290607,
        "AssetId": 193041
    },
    "-2147290603": {
        "DefinitionId": 193042,
        "ResourceId": -2147290603,
        "AssetId": 193042
    }
}
Run Code Online (Sandbox Code Playgroud)

javascript json node.js

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

使用Express处理最佳实践

我正在写一个实现用户管理系统的网站,我想知道我必须考虑哪些关于表单处理的最佳实践.

特别是性能,安全性,SEO和用户体验对我来说非常重要.当我处理它时,我遇到了几个问题,我没有找到一个完整的节点/快速代码片段,在那里我可以找出我以下的所有问题.

使用案例:有人将更新其个人资料的生日.现在我正在对同一个URL执行POST请求以处理该页面上的表单,POST请求将使用302重定向到同一URL进行响应.

关于表单处理的一般问题:

  1. 我应该为表单处理执行POST请求+ 302重定向,还是像AJAX请求那样做其他事情?
  2. 我应该如何处理无效的FORM请求(例如,无效登录或电子邮件地址已在注册期间使用)?

表达有关表单处理的具体问题:

  1. 我假设在将任何内容插入我的数据库之前,我需要清理并验证服务器端的所有表单字段.你会怎么做?

  2. 我读了一些关于CSRF的事情,但我从未实施过CSRF保护.我也很高兴在代码片段中看到它

  3. 使用Express处理表单时是否需要处理任何其他可能的漏洞?

示例HTML/Pug:

form#profile(method='POST', action='/settings/profile')
    input#profile-real-name.validate(type='text', name='profileRealName', value=profile.name)
    label(for='profile-real-name') Name

    textarea#profile-bio.materialize-textarea(placeholder='Tell a little about yourself', name='profileBio')
        | #{profile.bio}
    label(for='profile-bio') About

    input#profile-url.validate(type='url', name='profileUrl', value=profile.bio)
    label(for='profile-url') URL

    input#profile-location.validate(type='text', name='profileLocation', value=profile.location)
    label(for='profile-location') Location

    .form-action-buttons.right-align
        a.btn.grey(href='' onclick='resetForm()') Reset
        button.btn.waves-effect.waves-light(type='submit')
Run Code Online (Sandbox Code Playgroud)

路由处理程序示例:

router.get('/settings/profile', isLoggedIn, profile)
router.post('/settings/profile', isLoggedIn, updateProfile)

function profile(req, res) {
    res.render('user/profile', { title: 'Profile', profile: req.user.profile })
}

function updateProfile(req, res) {
    var userId = req.user._id
    var form = req.body
    var profile = { …
Run Code Online (Sandbox Code Playgroud)

security node.js express body-parser

6
推荐指数
1
解决办法
976
查看次数

Promise.all消耗我所有的RAM

我有一个我正在使用的API的速率限制器,它允许每秒20个请求.所有请求都是基于承诺的,一旦有响应,承诺将通过API数据解决.

问题:

我设置了一个promiseArray,它包含所有等待响应的58k承诺.所以内存越来越慢,直到我的内存耗尽为止.在我的具体情况下,我不需要将已解析的数据传递给我then(),数据占用了我所有的RAM.

代码:

  }).then(() => {
    // 2. Crawl for all clanprofiles from these leaderboards
    const promiseArray = []
    for (let i = 0; i < clanTags.length; i++) {
      // Resolved data from getClanProfile() is eating up all my RAM
      const p = backgroundScheduler.getClanProfile(clanTags[i], true)
      promiseArray.push(p)
    }
    return Promise.all(promiseArray)
  }).then(() => {
Run Code Online (Sandbox Code Playgroud)

那么有没有办法等待promiseArray被解析而不需要解析数据?

javascript node.js bluebird

6
推荐指数
1
解决办法
1032
查看次数

从 Windows 主机访问 dockerized redis

对于 windows 上的节点后端开发,我试图在 docker 容器中设置 redis,因为 redis windows 版本对我来说似乎有问题。我对 docker 很陌生,我不知道随之而来的所有原则。

到目前为止我做了什么:

  1. 安装码头工人
  2. 运行“docker pull redis”
  3. 运行 'docker run --name some-redis -d redis redis-server --appendonly yes' 启动 redis 容器

问题:

我尝试连接到 127.0.0.1:6379(当我在我的系统上本地安装 redis 时它曾经工作过),但它超时了。我以为redis容器有它自己的ip地址,我认为它的ip地址是172.17.0.2。连接到这个 ip 也不起作用。

PS C:\WINDOWS\system32> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' some-redis
172.17.0.2

PS C:\WINDOWS\system32> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d3b796e9df5c        redis               "docker-entrypoint..."   About an hour ago   Up 8 minutes        6379/tcp            some-redis
Run Code Online (Sandbox Code Playgroud)

为了从本地机器连接到容器内的 redis,我缺少什么?(我的节点应用程序没有 dockerized)

redis docker

6
推荐指数
1
解决办法
1920
查看次数

随着收集量的增加(文档数量),Upsert性能下降

使用案例:

我正在使用REST Api来提供视频游戏的战斗结果.这是一个团队与团队在线游戏,每个团队由3名玩家组成,他们可以从100个不同角色中选择不同的角色.我想计算每个球队组合的胜负数和平局数.我每秒大约获得1000次战斗结果.我连接每个团队的角色ID(升序)然后我保存每个组合的赢/输和抽奖.

我目前的实施:

const combinationStatsSchema: Schema = new Schema({
  combination: { type: String, required: true, index: true },
  gameType: { type: String, required: true, index: true },
  wins: { type: Number, default: 0 },
  draws: { type: Number, default: 0 },
  losses: { type: Number, default: 0 },
  totalGames: { type: Number, default: 0, index: true },
  battleDate: { type: Date, index: true, required: true }
});
Run Code Online (Sandbox Code Playgroud)

对于每个返回的日志,我执行upsert并将这些查询批量发送(5-30行)到MongoDB:

const filter: any = { combination: log.teamDeck, gameType, battleDate };
if …
Run Code Online (Sandbox Code Playgroud)

javascript performance upsert mongodb node.js

6
推荐指数
1
解决办法
374
查看次数

监控 Kubernetes 节点上的 pod 资源使用情况

用例/问题

我负责维护一个有 40 个节点的 kubernetes 集群(分为 2 个区域)。我们有大约 100 个微服务和平台东西,比如在这个集群中运行的 Kafka 代理。所有微服务都定义了资源请求和限制。然而,它们中的大多数都是可突发的,并且没有保证的 RAM。在我们的集群中部署服务的开发人员定义的限制远大于请求(参见下面的示例),最终导致各个节点上的大量 pod 被驱逐。不过,我们仍然希望在我们的服务中使用可爆发资源,因为我们可以使用可爆发资源来节省资金。因此,我需要更好地监控每个节点上运行的所有 pod 的可能性,其中包含以下信息:

  • 节点名称和 CPU / RAM 容量
  • 所有 pod 名称加上
    • pod 的资源请求和限制
    • pod 当前的 cpu 和 ram 使用情况

通过这种方式,我可以轻松识别两种有问题的服务:

案例 A:微服务只是设置了巨大的资源限制,因为开发人员只是在测试东西或者懒得去测试/监控他的服务

resources:
  requests:
    cpu: 100m
    ram: 500Mi
  limits:
    cpu: 6
    ram: 20Gi
Run Code Online (Sandbox Code Playgroud)

案例B:同一节点上的服务太多,资源限制设置不准确(例如500Mi,但服务一直使用1.5Gi RAM)。这种情况发生在我们身上,因为 Java 开发人员没有注意到 Java 垃圾收集器只会在使用 75% 的可用 RAM 时才开始清理。

我的问题:

我如何才能正确监控这一点,从而识别错误配置的微服务,以防止出现此类驱逐问题?在较小的规模下,我可以简单地运行kubectl describe nodeskubectl top pods手动计算出来,但在这种规模下不再起作用。

注意:我找不到此问题的任何现有解决方案(包括使用 kube 指标和类似的 prometheus + grafana 板)。我认为这是可能的,但在 Grafana 中可视化这些东西真的很难。

monitoring kubernetes

6
推荐指数
1
解决办法
5975
查看次数

Gauge 中的动态普罗米修斯标签

我想知道是否/如何添加动态标签。我不知道要添加到仪表值中的标签的键或数量。

我试过的

labelsContainers = []string{"node", "container", "pod", "qos", "namespace", "nodepool"}

// Requested resources
requestedContainerCPUCoresGauge = prometheus.NewGaugeVec(
    prometheus.GaugeOpts{
        Namespace: namespace,
        Subsystem: "pod_container_resource_requests",
        Name:      "cpu_cores",
        Help:      "Requested CPU cores in Kubernetes configuration",
    },
    labelsContainers)

for _, containerMetric := range containerMetrics {
    containerLabels := prometheus.Labels{
        "node":      containerMetric.Node,
        "container": containerMetric.Container,
        "qos":       containerMetric.Qos,
        "pod":       containerMetric.Pod,
        "namespace": containerMetric.Namespace,
    }

    for key, value := range containerMetric.NodeLabels {
        containerLabels[key] = value
    }

    requestedContainerCPUCoresGauge.With(containerLabels).Set(containerMetric.RequestedCPUCores)
    requestedContainerRAMBytesGauge.With(containerLabels).Set(containerMetric.RequestedMemoryBytes)
}
Run Code Online (Sandbox Code Playgroud)

问题

这引发了恐慌。我认为这是因为舞会客户期望在labelsContainers中定义的那些标签并且不允许进一步的标签。如何创建允许附加(未知)标签的仪表?

go prometheus

6
推荐指数
1
解决办法
4599
查看次数

如何找到Kafka代理高CPU使用率的根本原因?

我负责操作两个kafka集群(一个用于prod,一个用于我们的dev环境)。设置大部分是类似的,但是开发环境没有SASL / SSL设置,仅使用4个代理而不是8个代理。每个代理都分配给具有4个vCPU和26GB RAM的专用google kubernetes节点。

在我们的开发环境中,我们每秒大约接收1000条消息,并且这4个代理中的每个代理都使用4个可用CPU内核中的3个(始终占75%的CPU利用率)。

在我们的生产环境中,我们每秒获得约1500条消息,并且CPU使用率也是4个内核中的3个。

看来,CPU使用率至少是我们的瓶颈,我想知道如何执行CPU配置文件,以便我确切地知道造成CPU使用率高的原因。由于它是相对一致的,我猜可能是我们的快速压缩。

我对所有想法都感兴趣,我该如何调查CPU使用率高的原因以及如何在集群中进行调整。

  • Apache Kafka版本:2.1(CPU负载以前在Kafka 0.11.x上也很相似)

  • 开发集群(快速压缩,无SASL / SSL,4个代理):每秒1000条消息,3个CPU核心的使用率一致

  • 产品集群(Snappy压缩,SASL / SSL,8个代理):每秒1500条消息,使用3个CPU核心

旁注:我已经确保生产者快速生成压缩的消息。我可以访问所有JMX指标,但是找不到任何有用的方法来弄清楚CPU的使用情况。

我已经将度量标准附加到了我的方法(这也是我从中获得CPU使用情况统计信息的地方)。问题在于容器的CPU使用率并没有告诉我为什么它这么高。我需要更多的粒度,例如花在哪些CPU周期上(压缩?代理通信?sasl / ssl?)。

apache-kafka

6
推荐指数
1
解决办法
2046
查看次数

测试异步函数以使用 mocha 抛出

我有一个异步函数,它运行 2000 毫秒,然后它会抛出异常。我正在尝试使用 Mocha/chai 完全测试这种行为,但显然我做错了。

这就是我尝试过的:

第一的:

expect(publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000)).to.eventually.throw();
Run Code Online (Sandbox Code Playgroud)

这将测试标记为通过(运行时间为 52 毫秒),但在 2 秒后抛出异常。所以显然它根本没有等待该功能的承诺。

第二:

expect(async () => {
      await publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000);
    }).to.throw();
Run Code Online (Sandbox Code Playgroud)

测试失败:应在预定义超时后拒绝预定消息:AssertionError:预期 [Function] 在 Context.mocha_1.it (test\integration\rpc-communication.spec.ts:75:16) 处引发错误

预期行为是测试通过,因为在 2000 毫秒后抛出异常,这在给定的测试用例超时 4000 毫秒内。

附加信息:

这会奏效。承诺因错误而被拒绝(我也可以将其更改为用字符串拒绝)。这应该证明 dispatchMessage() 按预期工作。测试用例需要 2002 毫秒,然后通过。

    try {
      await publisher.dispatchMessage<ExampleResponseMessage>(message, {}, 2 * 1000);
    } catch (err) {
      expect(err).to.be.an('Error');
    }
Run Code Online (Sandbox Code Playgroud)

题:

如何正确测试异步函数是否引发异常?

mocha.js chai typescript chai-as-promised

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

Nginx入口资源-重定向到www(SSL不起作用)

用例

我使用以下头盔图表将nginx入口控制器部署到了Kubernetes集群中:

https://github.com/helm/charts/tree/master/stable/nginx-ingress

我为前端服务网络服务器创建了一个入口资源,它应该从非www重定向到www版本。我也使用SSL。

问题

当我访问网站的www版本时,一切都很好,nginx使用我的Lets Encrypt SSL证书(在正确的名称空间中以秘密形式存在)为页面提供服务。但是,当我访问该网站的NON-www版本时,在浏览器(NET :: ERR_CERT_AUTHORITY_INVALID)中看到失败的SSL证书页面,并且可以看到该页面是使用Kubernetes入口伪造证书提供的。我认为这也是重定向到www版本根本不起作用的原因。

这是我的入口资源(实际的主机名已被删除):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
  creationTimestamp: 2018-10-03T19:34:41Z
  generation: 3
  labels:
    app: nodejs
    chart: nodejs-1.0.1
    heritage: Tiller
    release: example-frontend
  name: example-frontend
  namespace: microservices
  resourceVersion: "5700380"
  selfLink: /apis/extensions/v1beta1/namespaces/microservices/ingresses/example-frontend
  uid: 5f6d6500-c743-11e8-8aaf-42010a8401fa
spec:
  rules:
  - host: www.example.io
    http:
      paths:
      - backend:
          serviceName: example-frontend
          servicePort: http
        path: /
  tls:
  - hosts:
    - example.io
    - www.example.io
    secretName: example-frontend-tls
Run Code Online (Sandbox Code Playgroud)

问题

为什么Nginx也不能在非www版本上使用提供的证书?

nginx kubernetes kubernetes-ingress nginx-ingress

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