代码工作所必需的工程

从更广的意义上讲,偶然的复杂性是开发人员添加到代码中的复杂性,而这并不是代码工作所必需的。这可能包括过度工程、过度使用设计模式、工具、框架和范例的选择不当,以难以理解的方式编写代码片段。例如,如果您可以使使用微服务(并且必须决定粒度、协调它们等等)。或者消息驱动的体系结构(设置代理及其队列的各种配置)不必要地增加了软件的复杂性,因此是偶然的复杂性。如果您想解析XML并将其隐藏到对象中,那么使用SAX与XML到对象映射程序(例如JAXB)相比,使用SAX会增加许多意外的复杂性,在这种情况下,您只需要添加一些注释(希望如此)。如果您的逻辑可以用几个lambda表达式表示,但是您可以在其中使用if子句执行几个嵌套的for-循环,那么这是偶然的复杂性。至少对我来说,意外的复杂性是因为除了不知道更好的知识之外,更难阅读、维护和部署。

另一方面,本质的复杂性来自于你试图用你的软件建模的世界。是关于如果您希望您的软件适合实际使用。基本的复杂性可以而且确实会使您的代码更难阅读和维护。它使它看起来像“遗留”代码,但事情就是这样的,应该是这样的。意外的API调用,存在于某些奇怪的边缘案例中,您在半年的实际使用之后发现了这些类,如果您认为可以删除这些类,这些都是真正软件的标志。

(我知道另一种偶然的复杂性观点-它仍然增加了价值,但并不是你正在解决的问题。这是一个长时间的讨论,但我认为任何固有的复杂和需要完成的事情(例如滚动更新)都是基本的复杂性,也就是说,没有它你就不能做。

如果您正在建模的业务流程有很多分支,甚至循环,并且无法进行优化,那么处理该业务流程的代码必须是“多毛的”。当你不得不在一个可能失去连接性或者连接性差的设备上运行软件时,可以随时重新启动,那么重新尝试、重新应用离线步骤等等的代码是必要的,即使它很大,很难理解。

但就是这样吗?难道我们不能对我们本质上的复杂性做任何事情,我们只能把丑陋的代码留在那里,耸耸肩说:“好吧,我知道这很糟糕,伙计,但你能做什么--基本的复杂性”。

我们无法摆脱它。但我们可以稍微友好一点。我有两种具体的方法。

记录需要复杂性的方案。直接在代码中,或者在代码中链接。看起来“wtf”的大多数代码看起来完全符合逻辑如果我们通过解释其背后的商业原因,确保所有奇怪的代码对每个人来说都是有意义的,那么我们就解决了问题的一部分。

https://movie.douban.com/people/246643792/

但这只是表面上的。当涉及到本质的复杂性时,我们真的能遵循“保持简单,愚蠢”(接吻)的原则吗?是的,在一定程度上。你不能使复杂性变得简单,但你可以用一种更简单的方式来表达它。我们想要实现的是降低感知的复杂性,使之更容易理解和推理。

首先要寻找的是你在本质上引入的任何偶然的复杂性。通常情况下,本质的复杂性使得意外的复杂性更有可能出现,可能是因为开发人员的所有注意力都集中在掌握他正在处理的场景的每个方面,而忘记了良好的实践。但仅仅消除这种情况也是不够的。

​​​​​​https://m.imdb.cn/title/tt6900448/review_121

具有讽刺意味的是,这里是通用(设计)模式和特定框架派上用场的地方。您需要表示应用程序的复杂的状态序列吗?使用有限状态机实现,而不是零星的。您需要表示一个复杂的业务流程吗?使用业务流程管理框架,而不仅仅是流控制结构。您的类中有很多依赖项(即使您的类设计和打包得很好)?使用依赖注入框架。或者在很多情况下-只是重构,显的事情,但我们都看到了复杂的方法,它们只是做了很多事情,却没有遵循这种方法。因为它是随着时间增长的,所以没有人意识到它已经变得那么大了。

但除了几个例子外,我不能给出一个一般规则。降低感知的复杂性(显然)在很大程度上取决于降低复杂性的人的感知。但是,作为一个单行建议,请始终考虑如何围绕应用程序固有的、基本的复杂性重新排列代码,使其看起来不那么复杂。

https://zhuanlan.zhihu.com/p/413855892

如果在集群中运行RabbitMQ,则不太的一部分失去了与其余部分的连接)。上面的链接页解释了显示状态和配置行为的基本命令。当分区发生时,您希望首先得到有关这方面的通知,然后再解决它。

实际上,RabbitMQ会自动处理第二个cluster_partition_handling配置。它有三个值:忽略、暂停_少数派和自动愈合。上面链接的分区指南也解释了这一点(“我应该选择哪种模式?”)。请注意,无论您选择什么,您都有一个问题,您必须恢复连接。例如,最好使用暂停_少数派,然后手动重新连接。

幸运的是,检测分区相当简单。如果没有分区,Status命令有一个空的“分区”元素,如果有分区,则有一个非空的分区元素,或者根本没有这样的元素。因此,这一行进行检测:

1

clusterOK=$(sudo rabbitmqctl cluster_status | grep "{partitions,\[\]}" | wc -l)

例如,您可能希望将该脚本安排为每分钟运行一次。如何处理结果取决于您使用的工具(Nagios、CloudWatch等)。对于Nagios,有S CloudWatch,那么您可以这样做:

1

2

3

4

5

6

if [ "$clusterOK" -eq "0" ]; then

    echo "RabbitMQ cluster is partitioned"

    aws cloudwatch put-metric-data --metric-name $METRIC_NAME --namespace $NAMESPACE --value 1 --dimensions Stack=$STACKNAME --region $REGION

else

    aws cloudwatch put-metric-data --metric-name $METRIC_NAME --namespace $NAMESPACE --value 0 --dimensions Stack=$STACKNAME --region $REGION

fi

当分区发生时,重要的事情是得到有关它的通知。之后,它取决于特定的应用程序、问题、队列的配置(持久的、镜像的等等)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值