问题标签 [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.
http - HTTP PUT 上下文中幂等性的含义?
在这个关于 REST 的演示文稿中(时间戳 17:00-18:45),演讲者说 HTTPPUT
必须包含资源的所有属性,并且不能用于部分更新。这在 HTTP 中是必需的,否则它不是幂等的。
他对幂等性的定义是(这听起来很合理):
幂等是可以执行一次或多次并导致相同服务器状态的任何操作
然而,他接着举了一个例子,其中(意译):
请求 A:我使用 a
PUT
仅更新资源的 name 属性。请求 B:我使用 a
PUT
仅更新描述。在 A 和 B 之间,另一个客户端可以指定名称,然后在请求 B 之后,资源具有另一个客户端的名称和我的描述。因为请求 A 和 B 之后服务器状态不一样,所以这不是幂等操作。
我不确定这种解释:对我来说,幂等性只告诉你当你连续多次运行相同的操作时会发生什么。在上面的例子中,请求 A 和 B 是两个不同的操作,所以没有理由认为运行 A then B 应该有什么特别的保证;特别是,没有理由认为它们应该一起构成一个原子操作。
多次运行请求 A 与运行一次具有相同的效果(对于 B 也是如此),所以我认为它是幂等的(即使PUT
由于其他原因这是不正确的使用)。
我的理解不正确吗?
(注意:这是一个关于幂等性含义的问题,而不是 的适当使用PUT
)。
c++ - ffmpeg 中的 av_free* 函数是幂等的吗?
具体来说,我正在查看avformat_free_context
. 在我的代码的正常执行中,avformat_free_context
被适当地调用。我还想在类的析构函数中调用它,以防出现异常情况导致使用 的代码AVFormatContext
提前返回。当在已经释放的数据结构上调用 ffmpeg 自由函数时,它们的行为是否正确?
c# - 如何确定 $addToSet 是否实际将新项目添加到 MongoDB 文档中,或者该项目是否已经存在?
我正在使用 C# 驱动程序(来自 NuGet 的 v1.8.3),并且很难确定$addtoSet/upsert
操作是否实际上将新项目添加到给定数组中,或者该项目是否已经存在。
添加新项目可能分为两种情况,要么文档根本不存在并且只是由 upsert 创建,要么文档存在但数组不存在或不包含给定项目。
我需要这样做的原因是,我有大量数据要加载到 MongoDB 中,这些数据可能(不应该,但可能)在处理过程中中断。如果发生这种情况,我需要能够从头开始备份,而无需进行重复的下游处理(保持处理幂等)。在我的流程中,如果确定一个项目是新添加的,我将对该给定项目的下游处理排队,如果确定已经在文档中添加,则不需要更多的下游工作。我的问题是结果总是返回说调用修改了一个文档,即使该项目已经存在于数组中并且实际上没有任何修改。
根据我对 C# 驱动程序 api 的理解,我应该能够使用 进行调用WriteConcern.Acknowledged
,然后检查WriteConcernResult.DocumentsAffected
它是否确实更新了文档。
我的问题是,在所有情况下,写关注结果都返回了 1 个文档已更新。:/
这是我的代码正在调用的示例文档$addToSet
,它可能会或可能不会在“项目”列表中包含此特定项目以开始:
我的查询始终使用_id
基于处理元数据已知的值:
我的更新如下:
如果我在一个空集合上运行此代码一次,则会添加文档并且响应符合预期(DocumentsAffected = 1
,UpdatedExisting = false
)。如果我再次运行它(任意次数),文档似乎没有更新,因为它保持不变,但结果现在出乎意料(DocumentsAffected = 1
, UpdatedExisting = true
)。
DocumentsAffected = 0
如果文档未更改,这不应该返回吗?
由于我们每天需要进行数百万次这样的调用,我很犹豫是否将此逻辑转换为每个项目的多个调用(首先检查项目是否存在于给定的文档数组中,然后添加/排队或只是跳过)如果在一切皆有可能。
有没有办法让这个工作在一个单一的电话?
powershell - Copy-Item 没有目标目录
假设你有这个文件夹
您可以在 Bash 中运行此命令
它会创建
然后您可以重新运行命令而不更改结果。如何使用 PowerShell 做到这一点?
python - 用于控制流的 Python 嵌套 Try/Except/Else
我想以最优雅的 Python 方式实现:尝试在数据库中的某个过滤器上查找对象。只有在没有结果的情况下,才尝试使用另一个过滤器查找对象。如果没有返回结果,则该对象不存在,因此插入一个新实例。
我在想什么:
我不确定这个块是否正确或处理我想要完成的事情的最佳方式。
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。
还有其他人这样做吗?有什么理由不这样做?
ruby-on-rails - Sidekiq 在处理大数据时处理重新排队
请参阅下面的更新问题。
原始问题:
在我当前的 Rails 项目中,我需要解析大型 xml/csv 数据文件并将其保存到 mongodb。现在我使用以下步骤:
- 接收用户上传的文件,将数据存入mongodb
- 使用 sidekiq 对 mongodb 中的数据进行异步处理。
- 处理完成后,删除原始数据。
对于localhost中的中小数据,上述步骤运行良好。但是在heroku中,我使用hirefire来动态地上下缩放worker dyno。当工人仍在处理大数据时,hirefire 会看到空队列并缩小工人 dyno。这会向进程发送终止信号,并使进程处于未完成状态。
我正在寻找一种更好的解析方法,允许解析过程随时被终止(在接收到终止信号时保存当前状态),并允许进程重新排队。
现在我正在使用 Model.delay.parse_file 并且它不会重新排队。
更新
在阅读了 sidekiq wiki 之后,我找到了关于作业控制的文章。谁能解释代码,它是如何工作的,以及在接收到 SIGTERM 信号并且工作人员重新排队时如何保持其状态?
有没有其他方法可以处理工作终止、保存当前状态并从最后一个位置继续?
谢谢,
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方法)。
http - 幂等性是否包括响应代码?
对幂等方法的重复请求是否必须返回相同的响应代码?
很多其他人都在问同样的问题,结果却得到了相互矛盾的答案。答案应参考有关此事的权威来源。
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 来安装库)
谢谢