小白解释:什么是分布式微服务中的幂等? - LispCast

19-04-05 banq
                   

幂等意味着重复无关紧要。这意味着您可以安全地重试操作而不会出现问题。典型的例子是电梯按钮:你按两次它就不会叫来两部电梯。我们在这里探索为什么我们希望在电子邮件服务器中使用该属性。

什么是幂等?为什么它对分布式系统中的编程有很大帮​​助?到本集结束时,您将了解如何在自己的系统中实现幂等性。

嗨,我的名字是Eric Normand,我通过函数式编程帮助人们茁壮成长。幂等是重要的,因为它捕获了安全重试的本质。如果没有安全重试,您实际上无法实现安全的分布式协议。

什么是幂等?它的本质是,如果你问两次,它就像问一次一样。它具有相同的效果。典型的例子是电梯按钮,你走到电梯口,你按下按钮。它亮了,其他人来了,他们也按下按钮,同样的按钮,尽管这个按钮已经被你按亮了。

我们知道后面的人再按是没有效果的,我们仍然想出于某种原因这样做。这是一个简单的案例,也许他们是对的,也许信号没有到达电梯,反正值得尝试,因为它不会伤害任何事情。这就是我们想要在我们的分布式系统中灌输的东西。从技术上讲,它是一个代数属性。

当你在谈论按下按钮时,这是你在世界上的一种活跃效果。在代数中,它是纯函数,数学函数的属性。这意味着,如果您将字符串的字母大写两次,则无关紧要。第一次就够了。从技术上讲,如果将F应用于某个值,则假设为F(x),则应用F与应用F(x)相同。

你执行两次F应用,它与单个应用具有相同的效果,你可以说这意味着重复并不重要。我按了两次按钮。第二个并不重要。如果我应用了两次相同的功能,第二次无关紧要。第一次很重要。第二次,第三次,第五次,那些无所谓。

为什么这很重要?在分布式系统中,特别是在分布式系统中,我们遇到这样的问题,即网络上的消息是不可靠的。基本上,如果您发送消息,它可能无法到达那里,您将不会知道。你不知道它是否到了那里。

有时,你知道它是否没有到达那里。你得到一些连接断开的消息,但有时你只是听不到回复。它超时了。

它到了那里,确认超时了,还是从未到过那里?其他系统崩溃了吗?它在发送我的电子邮件之前还是在发送我的电子邮件之后崩溃了?你不知道。它崩溃了,为时已晚。电子邮件实际上是一个很好的例子,因为您不想发送两次相同的电子邮件。

假设您向一个电子邮件服务器发送一条消息:“请将此电子邮件发送给我的客户。”但是您没有收到客户的回复,那你做什么?发生了什么?你再次发送一次吗?

纠结之处在于:如果邮件服务器已经帮你发送了电子邮件怎么办?同一封电子邮件发送两次吗?如果它没有发送它并且我不再次发送,那么客户可能会收不到电子邮件。

这确实是一个真正的商业问题。幂等将解决这个问题。如果我可以再次发送相同的消息,并且它不会破坏任何东西,第二次发送将没有效果,就像电梯按钮一样,我可以整天发送这条消息。我可以发送一百次,但是电子邮件服务器只会发送一次,这是好事。

这个电子邮件服务器所做的就是解耦:它将产生的结果数量与请求该结果的次数进行了分离。我可以请求它一百次,但它只会发送一次结果数量,这才是你真正想要的东西,您希望能够使用有限的信息安全地重试。

接收邮件的服务器必须记住对方邮件服务器发送过的所有电子邮件的ID,这是完全完整的幂等性。通常,那是不切实际的。你不记得每一个ID,因为它可能有数百万。他们可以追溯到很多年前。您不太可能需要一个花费数年才能送达的请求。

在实际情况中,可能会有一个窗口,上面写着“好吧,我们会保留三天的ID。”这意味着您可以在这三天内重新发送相同的ID,服务器不会再次发送它。您必须找到一些实际限制,以平衡内存要求和您在系统中执行的重试。

请注意,非常重要的是,这种标识ID概念非常重要。如果您没有标识概念,再次发送相同的消息意味着什么?如果我想向此人发送两封电子邮件,我需要能够向他们发送两封电子邮件。我需要某种方式说明这两份邮件是不同的,如果我想重试,我想要某种方式说明这个与那个是相同的。

您需要一些标识ID证明,如果您正在查看电梯按钮,那么这个电梯服务的电子设备中可能存在一个特征,它知道我按下了是哪个按钮,是三楼或四楼的,这个按钮有一些标识符,首先允许它被按亮,并保持点亮状态,直到需要关闭它时。

这个标识符可能在多个地方使用,,“哦,我们需要在三楼上升电梯,因为我们知道那个被按的按钮及其含义。”“嘿,我已经发送了三楼的电梯,我不需要再这样做了。“ 电梯系统正在使用标识符。

你需要一个标识ID,其次一旦你拥有了这个ID,你就会使用一个是幂等操作的数据结构,具有幂等操作的公共幂等数据结构是一个set集合,如内存集。

如果您有一个数字集合set,则为每封电子邮件指定一个唯一的数字号码,当电子邮件服务器发送电子邮件时,它会知道电子邮件的数字,会将其添加到这个数字集合中。如果添加两次也没有关系,这时你已经有了幂等性。

电梯也是如此,如果你有一个带有ID的按钮,这意味着您可以发送两次,并且发送两次没有任何效果。

要确定是否已经发送过它?

非常简单。

在将事物添加到集合Set中之前,您需要设置“集合是否已经包含此ID?”如果确实如此,那么您就完成了。如果没有,则发送电子邮件,然后将ID放入集合中。还有其他数据结构是幂等的。如果你有哈希映射,那么它们是幂等的。

如果您添加相同的键和值两次,那么它没有额外的影响。您可以考虑使用幂等的另一件事就是向数字添加零。如果你需要某种幂等的加法,你就可以做到。

总结

让我们回顾一下。幂等意味着重复无关紧要。它是某些功能,某些操作的代数属性,但我们将其扩展到世界上的行为。我们将它扩展到我们可以对世界产生的效果,我们说要求效果两次与请求一次相同。那些副本也没关系。

我们在分布式系统中需要它,以便我们可以安全地重试。它允许我们将完成的内容与我们请求它完成的次数分离。您可以使用幂等数据结构和操作轻松实现它。它需要只是消息中的标识ID概念。

寻找那些需要正好发生一次的服务,比如可能就像发送电子邮件一样的服务。然后将消息写入日志,将它们包装在类似于使其具有幂等性的数据结构中就好了。

 

                   

1