假设我有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每一个ResourceId在ResourceIds.
我的计划:
我认为这将是一个完美的解决方案,以我的转换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) 我正在写一个实现用户管理系统的网站,我想知道我必须考虑哪些关于表单处理的最佳实践.
特别是性能,安全性,SEO和用户体验对我来说非常重要.当我处理它时,我遇到了几个问题,我没有找到一个完整的节点/快速代码片段,在那里我可以找出我以下的所有问题.
使用案例:有人将更新其个人资料的生日.现在我正在对同一个URL执行POST请求以处理该页面上的表单,POST请求将使用302重定向到同一URL进行响应.
关于表单处理的一般问题:
表达有关表单处理的具体问题:
我假设在将任何内容插入我的数据库之前,我需要清理并验证服务器端的所有表单字段.你会怎么做?
我读了一些关于CSRF的事情,但我从未实施过CSRF保护.我也很高兴在代码片段中看到它
使用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) 我有一个我正在使用的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被解析而不需要解析数据?
对于 windows 上的节点后端开发,我试图在 docker 容器中设置 redis,因为 redis windows 版本对我来说似乎有问题。我对 docker 很陌生,我不知道随之而来的所有原则。
到目前为止我做了什么:
问题:
我尝试连接到 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)
使用案例:
我正在使用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) 用例/问题
我负责维护一个有 40 个节点的 kubernetes 集群(分为 2 个区域)。我们有大约 100 个微服务和平台东西,比如在这个集群中运行的 Kafka 代理。所有微服务都定义了资源请求和限制。然而,它们中的大多数都是可突发的,并且没有保证的 RAM。在我们的集群中部署服务的开发人员定义的限制远大于请求(参见下面的示例),最终导致各个节点上的大量 pod 被驱逐。不过,我们仍然希望在我们的服务中使用可爆发资源,因为我们可以使用可爆发资源来节省资金。因此,我需要更好地监控每个节点上运行的所有 pod 的可能性,其中包含以下信息:
通过这种方式,我可以轻松识别两种有问题的服务:
案例 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 nodes并kubectl top pods手动计算出来,但在这种规模下不再起作用。
注意:我找不到此问题的任何现有解决方案(包括使用 kube 指标和类似的 prometheus + grafana 板)。我认为这是可能的,但在 Grafana 中可视化这些东西真的很难。
我想知道是否/如何添加动态标签。我不知道要添加到仪表值中的标签的键或数量。
我试过的
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中定义的那些标签并且不允许进一步的标签。如何创建允许附加(未知)标签的仪表?
我负责操作两个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?)。
我有一个异步函数,它运行 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)
题:
如何正确测试异步函数是否引发异常?
用例
我使用以下头盔图表将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版本上使用提供的证书?
node.js ×4
javascript ×3
kubernetes ×2
apache-kafka ×1
bluebird ×1
body-parser ×1
chai ×1
docker ×1
express ×1
go ×1
json ×1
mocha.js ×1
mongodb ×1
monitoring ×1
nginx ×1
performance ×1
prometheus ×1
redis ×1
security ×1
typescript ×1
upsert ×1