gpt4 book ai didi

javascript - 查找未用于应用程序的空闲端口 - 查找一些算法

转载 作者:搜寻专家 更新时间:2023-10-31 22:54:17 24 4
gpt4 key购买 nike

我在我的程序中使用以下 API 来确定可用端口并将其提供给应用程序运行

portscanner.findAPortNotInUse(3000, 65000, '127.0.0.1', function(error, port) {
console.log('AVAILABLE PORT AT: ' + port)
})

https://github.com/baalexander/node-portscanner

此空闲端口已提供给应用程序使用并且工作正常。问题是,如果我为 application A 提供一个空闲端口并且应用程序还没有占用它(有时需要一些时间...)并且即将出现其他 application B 并请求一个空闲端口,以便它为 APP B 提供应用程序 A 的端口导致问题的原因...有什么优雅的方法可以解决吗?

我的应用程序没有状态,所以它无法保存到哪个应用程序获取哪个端口...

有一个解决方案,我们可以随机化范围,但这并不稳健......

在我的应用程序中,我正在获取应提供免费端口以运行的应用程序的 URL。

更新

不能使用一些经纪人或其他东西来控制这个外部我需要找到一些算法(可能有一些智能随机)可以帮助我做到这一点在内部,即我的程序就像单例,我需要一些技巧如何在 50000 到 65000 之间提供端口,这将减少提供给应用程序的端口的冲突量

更新2

我决定试试下面的方法,你觉得怎么样?

使用 lodash https://lodash.com/docs/4.17.2#random确定与循环之间的端口,这些循环为以下范围提供 3 个(或更多,如果有意义的话)数字

portscanner.findAPortNotInUse([50001, 60000, 600010], '127.0.0.1', function(err, port) {
if(err) {
console.log("error!!!-> " +err);
}else {
console.log('Port Not in Use ' + port);
}

//using that in a loop
var aa = _.random(50000, 65000);

然后如果我在端口中得到错误,即所有 3 个端口都被占用,请再次运行此过程以获得其他 3 个随机数。欢迎提出意见!!!我试图找到一些方法来尽可能避免碰撞...

最佳答案

我会简单地接受这样一个事实,即在分布式系统中可能会出现问题,如果第一次尝试因任何原因失败,我会重试该操作(即获取空闲端口)。

幸运的是,已经有很多 npm 模块可以为您做到这一点,例如retry .

使用这个模块你可以重试一个异步操作直到它成功,配置等待策略,最多重试多少次,等等......

为了提供一个代码示例,它基本上可以归结为:

const operation = retry.operation();

operation.attempt(currentAttempt => {
findAnUnusedPortAndUseIt(err => {
if (operation.retry(err)) {
return;
}

callback(err ? operation.mainError() : null);
});
});

这个解决方案的好处是:

  • 在没有锁定的情况下工作,即如果一切正常,它是高效的并且资源使用率很低。
  • 在没有中央经纪人或类似机构的情况下工作。
  • 适用于任何规模的分布式系统。
  • 使用一种可以在分布式系统中重复使用的模式来解决各种问题。
  • 使用久经考验且可靠的 npm 模块,而不是手写所有这些东西。
  • 不需要您以主要方式更改代码,而只是添加几行代码。

希望这有帮助:-)

关于javascript - 查找未用于应用程序的空闲端口 - 查找一些算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com