问题标签 [idempotent]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
258 浏览

http - HTTP PUT 上下文中幂等性的含义?

这个关于 REST 的演示文稿中(时间戳 17:00-18:45),演讲者说 HTTPPUT必须包含资源的所有属性,并且不能用于部分更新。这在 HTTP 中是必需的,否则它不是幂等的。

他对幂等性的定义是(这听起来很合理):

幂等是可以执行一次或多次并导致相同服务器状态的任何操作

然而,他接着举了一个例子,其中(意译):

请求 A:我使用 aPUT仅更新资源的 name 属性。

请求 B:我使用 aPUT仅更新描述。

在 A 和 B 之间,另一个客户端可以指定名称,然后在请求 B 之后,资源具有另一个客户端的名称和我的描述。因为请求 A 和 B 之后服务器状态不一样,所以这不是幂等操作。

我不确定这种解释:对我来说,幂等性只告诉你当你连续多次运行相同的操作时会发生什么。在上面的例子中,请求 A 和 B 是两个不同的操作,所以没有理由认为运行 A then B 应该有什么特别的保证;特别是,没有理由认为它们应该一起构成一个原子操作。

多次运行请求 A 与运行一次具有相同的效果(对于 B 也是如此),所以我认为它是幂等的(即使PUT由于其他原因这是不正确的使用)。

我的理解不正确吗?

(注意:这是一个关于幂等性含义的问题,而不是 的适当使用PUT)。

0 投票
1 回答
1307 浏览

c++ - ffmpeg 中的 av_free* 函数是幂等的吗?

具体来说,我正在查看avformat_free_context. 在我的代码的正常执行中,avformat_free_context被适当地调用。我还想在类的析构函数中调用它,以防出现异常情况导致使用 的代码AVFormatContext提前返回。当在已经释放的数据结构上调用 ffmpeg 自由函数时,它们的行为是否正确?

0 投票
1 回答
1600 浏览

c# - 如何确定 $addToSet 是否实际将新项目添加到 MongoDB 文档中,或者该项目是否已经存在?

我正在使用 C# 驱动程序(来自 NuGet 的 v1.8.3),并且很难确定$addtoSet/upsert操作是否实际上将新项目添加到给定数组中,或者该项目是否已经存在。

添加新项目可能分为两种情况,要么文档根本不存在并且只是由 upsert 创建,要么文档存在但数组不存在或不包含给定项目。

我需要这样做的原因是,我有大量数据要加载到 MongoDB 中,这些数据可能(不应该,但可能)在处理过程中中断。如果发生这种情况,我需要能够从头开始备份,而无需进行重复的下游处理(保持处理幂等)。在我的流程中,如果确定一个项目是新添加的,我将对该给定项目的下游处理排队,如果确定已经在文档中添加,则不需要更多的下游工作。我的问题是结果总是返回说调用修改了一个文档,即使该项目已经存在于数组中并且实际上没有任何修改。

根据我对 C# 驱动程序 api 的理解,我应该能够使用 进行调用WriteConcern.Acknowledged,然后检查WriteConcernResult.DocumentsAffected它是否确实更新了文档。

我的问题是,在所有情况下,写关注结果都返回了 1 个文档已更新。:/

这是我的代码正在调用的示例文档$addToSet,它可能会或可能不会在“项目”列表中包含此特定项目以开始:

我的查询始终使用_id基于处理元数据已知的值:

我的更新如下:

如果我在一个空集合上运行此代码一次,则会添加文档并且响应符合预期(DocumentsAffected = 1UpdatedExisting = false)。如果我再次运行它(任意次数),文档似乎没有更新,因为它保持不变,但结果现在出乎意料(DocumentsAffected = 1, UpdatedExisting = true)。

DocumentsAffected = 0如果文档未更改,这不应该返回吗?

由于我们每天需要进行数百万次这样的调用,我很犹豫是否将此逻辑转换为每个项目的多个调用(首先检查项目是否存在于给定的文档数组中,然后添加/排队或只是跳过)如果在一切皆有可能。

有没有办法让这个工作在一个单一的电话?

0 投票
2 回答
530 浏览

powershell - Copy-Item 没有目标目录

假设你有这个文件夹

您可以在 Bash 中运行此命令

它会创建

然后您可以重新运行命令而不更改结果。如何使用 PowerShell 做到这一点?

0 投票
2 回答
862 浏览

python - 用于控制流的 Python 嵌套 Try/Except/Else

我想以最优雅的 Python 方式实现:尝试在数据库中的某个过滤器上查找对象。只有在没有结果的情况下,才尝试使用另一个过滤器查找对象。如果没有返回结果,则该对象不存在,因此插入一个新实例。

我在想什么:

我不确定这个块是否正确或处理我想要完成的事情的最佳方式。

0 投票
1 回答
2208 浏览

sql - Apache Camel 的幂等消费者模式是否可扩展?

我正在使用 Apache Camel 2.13.1 来轮询一个数据库表,其中包含超过 300k 行。我正在寻找使用幂等消费者 EIP来过滤已处理的行。

不过,我想知道该实现是否真的可扩展。我的骆驼背景是: -

似乎每 10 秒(通过 consumer.delay 参数)处理完整的 300k 行,这似乎非常低效。我希望某种反馈循环作为模式的一部分,以便提供过滤器的查询可以利用已处理的行集。

但是,CAMEL_MESSAGEPROCESSED 表中的 messageid 列的模式为

其中 1908988 是 request.body.ID 我已将 EIP 设置为 key on,因此这不容易合并到我的查询中。

有没有更好的方法使用 CAMEL_MESSAGEPROCESSED 表作为我的 select 语句的反馈循环,以便 SQL 服务器执行大部分负载?

更新:

所以,我后来发现是我的 ognl 代码导致了奇怪的消息 id 列值。将其更改为

已修复它。所以,既然我有一个可用的 messageId 列,我现在可以将我的“来自”SQL 查询更改为

但我仍然认为我正在破坏 Idempotent Consumer EIP。

还有其他人这样做吗?有什么理由不这样做?

0 投票
2 回答
1929 浏览

ruby-on-rails - Sidekiq 在处理大数据时处理重新排队

请参阅下面的更新问题。

原始问题:

在我当前的 Rails 项目中,我需要解析大型 xml/csv 数据文件并将其保存到 mongodb。现在我使用以下步骤:

  1. 接收用户上传的文件,将数据存入mongodb
  2. 使用 sidekiq 对 mongodb 中的数据进行异步处理。
  3. 处理完成后,删除原始数据。

对于localhost中的中小数据,上述步骤运行良好。但是在heroku中,我使用hirefire来动态地上下缩放worker dyno。当工人仍在处理大数据时,hirefire 会看到空队列并缩小工人 dyno。这会向进程发送终止信号,并使进程处于未完成状态。

我正在寻找一种更好的解析方法,允许解析过程随时被终止(在接收到终止信号时保存当前状态),并允许进程重新排队。

现在我正在使用 Model.delay.parse_file 并且它不会重新排队。

更新

在阅读了 sidekiq wiki 之后,我找到了关于作业控制的文章。谁能解释代码,它是如何工作的,以及在接收到 SIGTERM 信号并且工作人员重新排队时如何保持其状态?

有没有其他方法可以处理工作终止、保存当前状态并从最后一个位置继续?

谢谢,

0 投票
1 回答
31 浏览

rest - 有人可以给我一个幂等http方法的更好定义吗?

幂等意味着执行N次操作会产生相同的结果

http://restcookbook.com/HTTP%20Methods/idempotency/

作者提到“这只适用于结果,而不适用于资源本身”。结果和资源有什么区别?

例如,假设正文为“hello”的 PUT 将消息资源更新为“hello”。然后 PUT 用“goodbye”将其更新为“goodbye”。这里我们有 2 个 PUT,结果不一样,第一次资源值是“hello”,第二次是“goodbye”。

我阅读了Defining Idempotence,其接受的响应似乎说它必须是具有相同值的PUT(例如,连续两次PUT“hello”是幂等的,而不是一般的PUT方法)。

0 投票
1 回答
8257 浏览

http - 幂等性是否包括响应代码?

对幂等方法的重复请求是否必须返回相同的响应代码?

很多其他人都在问同样的问题,结果却得到了相互矛盾的答案。答案应参考有关此事的权威来源。

0 投票
1 回答
1085 浏览

pip - 补丁和需求文件的幂等 Bash 脚本

我有一个带有自己的需求文件的 python 项目。该项目还有自己的 virtualenv,其中一个包是“pyPdf”。该库有一个错误,我写了一个补丁来修复这个错误。

让我们将此文件称为 pypdf.patch。我使用 Linux patch 命令运行补丁。

我需要编写一个 bash 脚本来使用幂等属性做两件事(意味着多次运行脚本应该与一次运行相同)

1) 运行具有各种库要求的要求文件(例如 Flask==0.10.1 等,包括 git+ssh 要求)并对所有库进行 pip 安装。

2)将补丁应用到pypdf库。

感谢这方面的任何线索。请注意“幂等性”。

PS:我的 requirements.txt 文件看起来像这样。(我在 virtualenv 下做了一个 pip install - r requirements.txt 来安装库)

谢谢