RabbitMQ 教程 | 第10章 网络分区

👨🏻‍💻 热爱摄影的程序员
👨🏻‍🎨 喜欢编码的设计师
🧕🏻 擅长设计的剪辑师
🧑🏻‍🏫 一位高冷无情的编码爱好者
大家好,我是 DevOps 工程师
欢迎分享 / 收藏 / 赞 / 在看!

这篇 RabbitMQ 教程为学习者提供了全面的内容,从 RabbitMQ 的简介开始,涵盖了消息中间件的概念、RabbitMQ 的安装与使用,以及交换机、队列、路由键等相关概念的介绍。进一步深入,教程探讨了 AMQP 协议、客户端开发向导,以及消息的发送和消费方式。同时,学习者还可以了解消息传输保障、高级特性如死信队列、延迟队列、优先级队列、RPC 实现等。此外,教程还涵盖了 RabbitMQ 的管理、配置、运维、监控和集群管理等重要主题,帮助学习者充分掌握 RabbitMQ 的应用。整篇教程丰富内容详实,适合初学者和有经验的开发者参考学习。

全篇共 11 章,9 万余字。本文:第10章 网络分区。

第10章 网络分区

10.1 网络分区的意义

网络分区(Network Partition)是指在分布式系统中,由于网络故障或者其他原因,导致系统中的节点无法相互通信,形成了多个孤立的子网络。在这种情况下,每个子网络内部的节点可以正常通信,但不同子网络之间无法互相通信。

网络分区对消息传递的影响是非常重要的,它可能导致以下问题:

  1. 消息丢失: 在网络分区发生时,由于不同子网络之间无法通信,导致消息无法从一个子网络传递到另一个子网络。这会导致在网络分区期间发送的消息在整个系统范围内丢失。
  2. 消息重复: 当网络分区解除后,不同子网络之间的消息可能会重复传递。因为在网络分区期间,消息可能已经在某个子网络中传递了一次,而在网络分区解除后,它又会传递到其他子网络中。
  3. 消息乱序: 在网络分区发生时,由于不同子网络之间无法通信,消息的传递顺序可能会发生乱序。消息可能先到达一个子网络,而在其他子网络中却无法及时传递,导致消息的顺序不一致。
  4. 系统不可用: 如果网络分区导致集群中的多数节点无法通信,那么集群可能会出现“脑裂”问题,即形成多个孤立的子集群,每个子集群都认为自己是合法的集群,从而导致整个系统的不可用。

为了解决网络分区对消息传递的影响,可以采取以下策略:

  1. 引入消息确认机制: 在发送消息时,生产者可以要求 RabbitMQ 返回确认,以确保消息已经成功投递到队列中。在消费消息时,消费者可以通过消息确认机制来确认消息的处理情况。这可以避免消息的丢失和重复传递。
  2. 使用持久化队列和消息: 将队列和消息设置为持久化,可以确保在网络分区发生时,消息仍然保存在磁盘上,不会因为节点故障而丢失。
  3. 使用镜像队列: 使用镜像队列可以在多个节点上复制消息的副本,从而提高消息的可用性和数据冗余。
  4. 引入自动化网络分区处理机制: 可以通过一些自动化的机制来检测网络分区的发生,并自动进行处理。例如,可以采用 pause-minority、pause-if-all-down 或 autoheal 策略来自动处理网络分区。

总之,网络分区是分布式系统中常见的问题,对消息传递的影响非常重要。采取合适的策略和机制,可以在一定程度上解决网络分区带来的问题,确保消息传递的可靠性和一致性。

10.2 网络分区的判定

判定网络分区是否发生通常是通过监测节点之间的网络连接情况来进行的。在 RabbitMQ 集群中,可以采取以下方法来判定网络分区的发生:

  1. 心跳检测: RabbitMQ 集群中的节点会通过定期发送心跳消息来监测彼此的存活状态。如果一个节点在一定时间内没有收到其他节点的心跳消息,那么就会认为与其他节点发生了网络分区,从而触发网络分区事件。
  2. 节点连接状态: 可以通过查看 RabbitMQ 集群中节点的连接状态来判定是否发生了网络分区。当某个节点与其他节点断开连接或者无法与其他节点建立连接时,可能发生了网络分区。
  3. 监控指标: 通过监控 RabbitMQ 集群的一些关键指标,如消息发布速率、队列长度、消费者数量等,可以间接判定是否发生了网络分区。如果这些指标出现异常波动或者明显下降,可能是网络分区的信号。

处理网络分区事件的方法取决于具体的业务需求和系统设计。以下是一些常见的处理方式:

  1. 暂停少数派: 可以选择暂停网络分区中的少数派节点,保留多数派节点继续工作,从而保证整个集群的可用性。这可以通过 RabbitMQ 提供的 pause-minority 策略来实现。
  2. 暂停全部: 如果网络分区导致集群的多数节点无法通信,可以选择暂停所有节点,防止数据冲突和消息乱序。这可以通过 RabbitMQ 提供的 pause-if-all-down 策略来实现。
  3. 自动恢复: 可以通过自动化脚本或监控程序来检测网络分区的发生,并自动进行处理。例如,可以采用 autoheal 策略来自动恢复网络分区。
  4. 手动处理: 对于较为复杂的网络分区场景,可能需要手动介入来处理网络分区事件。这需要有经验的运维人员来判断网络分区的程度和影响,并做出相应的决策。

无论采用哪种处理方式,都应该在处理网络分区时小心谨慎,确保集群的数据一致性和消息可靠性。在设计系统时,也可以考虑采用多数据中心部署、镜像队列、联邦队列等技术来提高系统的可用性和容错性,从而降低网络分区带来的影响。

10.3 网络分区的模拟

在测试和验证网络分区处理策略时,我们可以通过模拟网络分区来模拟实际环境中的网络故障。这样可以让我们更好地了解系统在网络分区情况下的表现,以及验证我们设计的处理策略是否有效。以下是一些常见的模拟网络分区的方法:

  1. 断开网络连接: 最简单的方法是手动断开集群中某些节点之间的网络连接,或者将某些节点从网络中隔离。这可以模拟节点无法相互通信的情况,从而触发网络分区。
  2. 阻塞通信端口: 可以通过阻塞集群中节点之间的通信端口,使节点之间无法进行网络通信。这可以模拟网络连接断开的情况,从而触发网络分区。
  3. 虚拟网络: 使用虚拟化技术,可以创建多个虚拟网络,然后将不同节点分别放置在不同的虚拟网络中。这样可以模拟多个子网络之间的网络分区。
  4. 限制带宽: 可以通过限制网络带宽或增加网络延迟来模拟网络分区的效果。这可以模拟在网络拥堵或高负载情况下节点之间通信受阻的情况。
  5. 运行在不同地理位置: 如果系统的节点分布在不同的地理位置,可以通过将节点放置在不同的物理服务器或云服务提供商上,模拟节点之间的物理隔离。

无论使用哪种方法,都需要仔细考虑测试环境的搭建和网络分区的模拟情况,确保测试结果能够准确地反映实际情况。同时,进行网络分区测试时,应该密切关注集群的数据一致性和消息可靠性,确保系统在网络分区发生时能够正确地处理消息和数据。测试完成后,应该对网络分区处理策略进行充分评估和优化,以确保系统在面对真实网络分区时能够稳定运行。

10.4 网络分区的影响

了解网络分区对 RabbitMQ 的影响,包括未配置镜像和已配置镜像的情况。

10.4.1 未配置镜像

在未配置镜像的情况下,网络分区可能会对消息传递产生以下影响:

  1. 消息丢失: 当网络分区发生时,集群中的某些节点无法与其他节点通信。如果消息发送到了一个无法与其他节点通信的节点上,那么这些消息可能会丢失,因为在网络分区期间,无法将消息复制到其他节点上进行备份。
  2. 消息堆积: 在网络分区期间,无法将消息传递到其他节点,导致消息堆积在发生网络分区的节点上。一旦网络分区解决,大量堆积的消息会在短时间内传递到其他节点,可能导致网络拥堵和性能下降。
  3. 数据不一致: 在网络分区期间,无法将消息传递到其他节点,可能导致数据不一致。例如,如果一个节点在网络分区期间接收了一些消息,而其他节点无法获得这些消息,那么在网络分区解决后,这些节点的数据将不一致。
  4. 消息乱序: 在网络分区期间,消息可能会在不同节点上产生乱序。因为网络分区导致节点之间无法进行同步,所以消息在网络分区解决后可能会以不同的顺序传递到其他节点。

为了避免上述问题,可以通过配置镜像队列来增加消息的冗余备份。镜像队列会将队列中的消息自动复制到其他节点上,保证即使发生网络分区,数据仍然可以在其他节点上得到备份,避免数据丢失和不一致。同时,在设计系统时,也可以采用多数据中心部署,将节点分布在不同的物理位置上,从而降低因网络分区而导致的影响。在实际应用中,根据业务需求和系统规模,综合考虑数据一致性和性能要求,选择合适的策略来处理网络分区情况。

10.4.2 已配置镜像

在已配置镜像的情况下,网络分区对消息传递会产生以下影响:

  1. 消息冗余备份: 当配置了镜像队列后,消息会被自动复制到其他节点上,保证在发生网络分区时,消息的冗余备份仍然存在于其他节点上。这样可以避免消息的丢失,即使发生了网络分区,消息仍然可以在其他节点上找到。
  2. 消息传递延迟: 虽然已配置镜像队列,但由于网络分区的存在,导致消息可能无法及时传递到其他节点。在网络分区解决后,节点之间可能需要一定时间来同步消息,从而导致消息传递延迟。
  3. 消息冲突: 在网络分区期间,如果不同的节点都在处理相同的消息,可能会导致消息冲突。当网络分区解决后,可能出现相同的消息在不同节点上被重复处理,需要保证业务逻辑的幂等性来避免数据的重复处理。
  4. 数据一致性: 在网络分区期间,由于节点之间无法进行同步,可能导致数据不一致。即使消息被复制到其他节点上,也无法保证所有节点都能实时同步更新。

配置了镜像队列是为了增加消息的冗余备份,从而提高消息的可靠性和高可用性。在网络分区发生时,虽然消息仍然存在于其他节点上,但在解决网络分区后,可能需要进行数据同步和冲突处理。因此,在设计系统时,需要综合考虑数据一致性和性能要求,并确保系统能够正确处理网络分区带来的影响。

10.5 手动处理网络分区

手动处理网络分区可以通过以下步骤来恢复消息传递:

  1. 检测网络分区: 首先,需要检测网络分区是否已经发生。可以通过监控工具或RabbitMQ的管理界面来查看集群节点之间的连接状态和通信情况。如果发现某些节点无法与其他节点通信,那么很可能发生了网络分区。
  2. 解决网络分区原因: 接下来,需要找出网络分区发生的原因。网络分区可能是由网络故障、节点故障、防火墙设置等问题引起的。解决网络分区原因是恢复消息传递的前提。
  3. 处理消息堆积: 在网络分区期间,可能有大量消息堆积在某些节点上。在解决网络分区后,这些堆积的消息会开始传递到其他节点。为了避免消息传递过程中的网络拥堵,可以逐步增加网络吞吐量,或者根据业务情况设置合理的流控策略。
  4. 数据同步: 在网络分区解决后,需要确保所有节点的数据是一致的。可以使用RabbitMQ的镜像队列功能来自动同步消息。确保所有节点上的队列都已镜像,并等待所有镜像队列同步完成。
  5. 消息冲突处理: 在网络分区期间,如果不同节点都在处理相同的消息,可能会导致消息冲突。为了处理消息冲突,可以在业务逻辑中引入幂等性机制,确保相同消息的重复处理不会引发问题。
  6. 监控恢复状态: 在网络分区处理完成后,需要持续监控集群状态,确保消息传递正常。通过监控工具或RabbitMQ的管理界面,查看消息传递情况和队列状态,确保集群正常运行。

处理网络分区是一个复杂的过程,需要综合考虑网络状态、消息堆积、数据一致性等因素。在设计系统时,可以采用多数据中心部署、配置镜像队列等策略来增加系统的可靠性和高可用性,从而更好地应对网络分区带来的影响。

10.6 自动处理网络分区

学习 RabbitMQ 提供的自动处理网络分区的功能,包括 pause-minority 模式、pause-if-all-down 模式和 autoheal 模式。

10.6.1 pause-minority 模式

pause-minority 模式是 RabbitMQ 集群中的一种处理网络分区的策略。在这种模式下,当集群发生网络分区时,RabbitMQ 会主动暂停少数节点上的所有队列,以确保少数节点与多数节点保持一致,从而避免消息的丢失和数据不一致。

原理和用法: 在 pause-minority 模式下,RabbitMQ 集群中的节点会被分为两个组:多数节点和少数节点。多数节点是指处于正常状态的节点数大于等于半数的节点,而少数节点则是指处于正常状态的节点数小于半数的节点。

当集群发生网络分区时,如果少数节点无法与多数节点通信,那么少数节点上的所有队列都会被主动暂停,这样可以确保只有多数节点上的队列能够继续处理消息。在网络分区解决后,集群会自动将暂停的队列恢复,并开始处理消息。

适用场景:pause-minority 模式适用于对数据一致性要求较高的场景,特别是在发生网络分区时希望保证数据的完整性而不希望消息丢失的情况下。这种模式可以确保少数节点的数据不会脱离多数节点太多,并在网络分区解决后自动恢复消息传递。

然而,需要注意的是,在 pause-minority 模式下,少数节点上的队列被暂停后,可能导致这些节点的消息堆积。因此,如果在少数节点上的消息量较大,暂停队列可能会导致性能下降。在设计系统时,需要综合考虑业务需求、网络环境和集群规模,合理选择是否使用 pause-minority 模式来处理网络分区。

10.6.2 pause-if-all-down模式

pause-if-all-down 模式是 RabbitMQ 集群中的一种处理网络分区的策略。在这种模式下,当集群发生网络分区时,RabbitMQ 会自动将所有节点上的所有队列都暂停,以防止消息的丢失和数据不一致。

原理和用法: 在 pause-if-all-down 模式下,集群中的所有节点会被同时监测。当集群发生网络分区时,所有节点都无法通信,RabbitMQ 会自动将所有节点上的所有队列都暂停。这样做的目的是为了确保消息不会在网络分区期间传递到其他节点,以免数据不一致和消息丢失。

当网络分区解决后,RabbitMQ 会自动恢复所有队列,开始处理消息传递。

适用场景:pause-if-all-down 模式适用于对数据一致性要求非常高的场景,特别是在发生网络分区时不希望有任何消息传递的情况下。这种模式可以确保在网络分区期间所有节点的状态保持一致,避免任何消息传递,从而保证数据的完整性。

然而,需要注意的是,在 pause-if-all-down 模式下,所有队列都会被暂停,这可能导致整个集群的消息堆积。在网络分区解决后,可能需要一定的时间来处理积压的消息。因此,在使用此模式时,需要谨慎考虑可能产生的性能影响,并确保业务逻辑能够处理积压消息的情况。

在实际应用中,通常根据业务需求和对数据一致性的要求来选择适合的网络分区处理策略。 pause-if-all-down 模式适用于对数据一致性要求非常严格的场景,但需要注意可能带来的性能影响。

10.6.3 autoheal模式

autoheal 模式是 RabbitMQ 集群中的一种处理网络分区的策略。在这种模式下,当集群发生网络分区时,RabbitMQ 会尝试自动恢复网络分区,以保持集群的一致性和可用性。

原理和用法: 在 autoheal 模式下,集群中的所有节点会被同时监测。当集群发生网络分区时,RabbitMQ 会尝试自动恢复网络连接,并尝试重新建立分区前的集群状态。这意味着 RabbitMQ 会自动寻找可以重新连接的节点,并将它们重新纳入集群。

一旦网络分区解决,RabbitMQ 会自动恢复所有队列,并开始处理消息传递。

适用场景:autoheal 模式适用于对可用性要求较高的场景,特别是在集群发生网络分区后,希望集群能够尽可能快地恢复正常状态,而不希望手动介入的情况下。这种模式可以自动尝试恢复网络分区,并将分区前的集群状态恢复到正常。

然而,需要注意的是,autoheal 模式并不能保证恢复网络分区一定会成功。在网络分区解决的过程中,可能会出现数据不一致或者消息丢失的情况。因此,在使用此模式时,需要谨慎考虑可能的风险,并确保业务逻辑能够处理数据一致性的问题。

在实际应用中,通常根据业务需求和对可用性的要求来选择适合的网络分区处理策略。autoheal 模式适用于希望尽可能快速地自动恢复网络分区的场景,但需要注意可能产生的数据不一致性和消息丢失的风险。

10.6.4 挑选哪种模式

根据实际情况选择合适的网络分区处理模式是非常重要的,因为不同的模式适用于不同的应用场景和业务需求。以下是一些考虑因素,帮助您选择合适的网络分区处理模式:

  1. 数据一致性要求: 如果对数据一致性有极高的要求,而且不能容忍任何消息丢失,可以选择 pause-if-all-down 或 pause-minority 模式。这两种模式在网络分区期间会暂停队列,确保数据在多数节点上保持一致。但需要注意,暂停队列可能会导致消息堆积。
  2. 可用性要求: 如果对可用性有较高的要求,希望在网络分区解决后能够尽快地自动恢复,可以选择 autoheal 模式。这种模式会自动尝试恢复网络分区,并尝试重新建立集群状态,但需要注意可能的数据不一致性和消息丢失。
  3. 性能影响: 不同的模式会对性能产生不同程度的影响。pause-if-all-down 和 pause-minority 模式在暂停队列时可能会导致消息堆积,影响性能。在选择模式时,需要综合考虑集群规模、网络环境和业务负载,确保能够承受可能的性能影响。
  4. 手动处理: 如果希望手动介入来处理网络分区,可以选择 manual 模式。这种模式下,RabbitMQ 不会主动处理网络分区,需要管理员手动决定如何处理分区。
  5. 自动化脚本: 如果希望通过自动化脚本来处理网络分区,可以选择 pause-minority 模式,并编写脚本来监测网络状态并执行相应的操作。

总之,选择合适的网络分区处理模式取决于业务需求、数据一致性要求、可用性要求和性能影响。在设计系统时,需要仔细考虑不同模式的优劣势,并结合实际情况做出选择。同时,也可以根据实际情况灵活调整网络分区处理策略,以满足不同场景下的需求。

10.7 案例:多分区情形

假设有一个由三个节点组成的 RabbitMQ 集群,分别是 Node A、Node B 和 Node C。现在发生了多个网络分区,导致 Node A 和 Node B 形成一个分区,Node C 独立成另一个分区。在这种情况下,我们可以使用 pause-minority 模式来处理多个网络分区。

案例描述:

  1. Node A 和 Node B 组成一个分区,称为分区 X。
  2. Node C 独立成另一个分区,称为分区 Y。

处理步骤:

  1. 在集群启动时,我们使用 pause-minority 模式来设置集群的网络分区处理策略。
  2. 当发生多个网络分区时,RabbitMQ 集群会自动检测到这些分区,并尝试进行自动处理。在 pause-minority 模式下,RabbitMQ 会暂停分区中的队列,使得分区中的队列处于不可用状态。
  3. 在本例中,分区 X 中的队列会被暂停,分区 Y 中的队列则保持可用状态。
  4. 当网络分区解决时,RabbitMQ 会自动尝试恢复网络连接,并尝试重新建立集群状态。
  5. 分区 Y 中的队列会继续处理消息,而分区 X 中的队列则会恢复,开始处理在网络分区期间暂停的消息。

需要注意的是,pause-minority 模式的自动处理过程可能会导致消息重复消费或消息顺序性问题。因为在分区 X 恢复时,可能会重新处理一些之前已经在分区 Y 中处理过的消息。在设计应用时,需要考虑这种可能性,并确保能够处理消息重复消费或消息乱序的情况。

此外,网络分区处理涉及到集群的高可用性和数据一致性问题,因此在实际应用中需要综合考虑业务需求和集群的性能特征,选择适合的网络分区处理策略。在测试和验证过程中,可以通过模拟多个网络分区的情况,来评估不同策略的效果,并确保系统能够在网络分区发生时保持稳定运行。

10.8 小结

本章介绍了 RabbitMQ 网络分区的处理,包括网络分区的意义、判定、模拟、影响、手动处理和自动处理等内容。在下一章中,我们将学习 RabbitMQ 的扩展特性,包括消息追踪、负载均衡等内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/77821.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】K8S二进制搭建三:高可用配置

目录 一、部署CoreDNS二、配置高可用三、配置负载均衡四、部署 Dashboard 一、部署CoreDNS 在所有 node 节点上操作 #上传 coredns.tar 到 /opt 目录中 cd /opt docker load -i coredns.tar在 master01 节点上操作 #上传 coredns.yaml 文件到 /opt/k8s 目录中,部…

三、JVM-如何判断对象已死问题

内存模型以及如何判定对象已死问题 体验与验证 2.4.5.1 使用visualvm visualgc插件下载链接 :https://visualvm.github.io/pluginscenters.html 选择对应JDK版本链接—>Tools—>Visual GC 若上述链接找不到合适的,大家也可以自己在网上下载对应…

面试热题(最长回文子串)

给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串 输入:s "babad" 输出:"bab" 最长回文子串以前的博客已经讲过KMP算法以及比较不常见的Manacher算法…

C# 使用堆栈实现队列

232 使用堆栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(、、、):pushpoppeekempty 实现 类:MyQueue void push(int x)将元素 x 推到队列的末尾 int pop()从队列的开头移除并返回元素 in…

Devops系统中jira平台迁移

需求:把aws中的devops系统迁移到华为云中,其中主要是jira系统中的数据迁移,主要方法为在华为云中建立一套 与aws相同的devops平台,再把数据库和文件系统中的数据迁移,最后进行测试。 主要涉及到的服务集群CCE、数据库mysql、弹性文件服务SFS、数据复制DRS、弹性负载均衡ELB。 迁…

【C++】容器篇(五)—— map和set的基本介绍

序言: 在之前,我们已经对STL中的 序列式容器 进行了相关的学习。本期,我将给大家介绍的则是另外一类容器 —— 关联式容器 !!! 目录 (一)容器回顾 💨【顺序容器】 &a…

数据结构——红黑树

文章目录 一.红黑树的定义二.红黑树的插入1.红黑树节点的定义2.红黑树的插入操作3.总结: 三.红黑树与AVL树的比较四.检验手写的红黑树五.源码 一.红黑树的定义 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色&#xff…

C++设计模式之访问者模式

C访问者设计模式 文章目录 C访问者设计模式什么是设计模式什么是访问者设计模式该模式有什么优缺点优点缺点 如何使用 什么是设计模式 设计模式是一种通用的解决方案,用于解决特定的一类问题。它是一种经过验证的代码组织方式,可以帮助开发人员更快地实…

STM32 DHT11

DHT11 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 使用单总线通信 该传感器包括一个电容式感湿元件和一个NTC测温元件,并于一个高性能8位单片机相连(模数转换)。 DHT11引脚说明 开漏模式下没有输出高电平的能…

Cilium系列-14-Cilium NetworkPolicy 简介

系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 介绍 Kubernetes 网络策略以及 CiliumNetworkPolicies 额外支持的内容。 网络策略(NetworkPolicy)的类型 默认情况下,Kubernetes 集群中的所有 pod 都可被其他 pod 和网络端点访问。 网络策…

【并发专题】单例模式的线程安全(进阶理解篇)

目录 背景前置知识类加载运行全过程 单例模式的实现方式一、饿汉式基本介绍源码分析 二、懒汉式基本介绍源码分析改进 三、懒汉式单例终极解决方案(静态内部类)(推荐使用方案)基本介绍源码分析 感谢 背景 最近学习了JVM之后&…

解决SVN或GIT忽略提交文件的问题

背景 使用IDEA 的SVN插件提交文件是总是会提交一些不需要提交的文件; 我们可以通过一些简单设置忽略这些文件。 git 在项目根目录新建文本文件,修改后缀为.gitignore 文件中添加内容 *.iml .project .gradle/ .idea/ target/ build/ .vscode/ .settings/ .facto…

Python 开发工具 Pycharm —— 使用技巧Lv.2

pydoc是python自带的一个文档生成工具,使用pydoc可以很方便的查看类和方法结构 本文主要介绍:1.查看文档的方法、2.html文档说明、3.注释方法、 一、查看文档的方法 **方法1:**启动本地服务,在web上查看文档 命令【python3 -m…

Mac系统下使用远程桌面连接Windows系统

一、远程桌面工具 Microsoft Remote Desktop 二、下载地址 https://go.microsoft.com/fwlink/?linkid868963 三、下载并安装 四、添加远程PC PC name:云服务器IP。 User account: 添加系统用户 PC name:远程桌面 IP 地址User account:可以选择是…

【iOS】多线程 锁问题总结

文章目录 前言1. 你理解的多线程优点缺点 2. atomic 和 nonatomic 的区别及其作用3. GCD的队列类型 - 三种队列类型4. GCD的死锁问题线程死锁的四个必要条件 5. 多线程之间的区别和联系6. 进程和线程?进程间的通信方式线程间的通信方式 6. iOS的线程安全手段如何保证…

Matlab修改文本编码格式为UTF-8

一、修改文本编码格式 Matlab默认使用GBK编码格式&#xff0c;当代码中有中文注释时&#xff0c;注释显示乱码。 修改配置文件(安装目录下的bin目录有个lcdata.xml)&#xff0c;如下&#xff1a; 1. 删除 2. 修改 < encoding name”UTF-8”> < encoding_alias nam…

postgresql 使用之 存储架构 触摸真实数据的存储结构以及组织形式,存入数据库的数据原来在这里

存储架构 ​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 postgresql 数据库服务运行时&#xff0c;数据在磁…

kafka-保证数据不重复-生产者开启幂等性和事务的作用?

1. 生产者开启幂等性为什么能去重&#xff1f; 1.1 场景 适用于消息在写入到服务器日志后&#xff0c;由于网络故障&#xff0c;生产者没有及时收到服务端的ACK消息&#xff0c;生产者误以为消息没有持久化到服务端&#xff0c;导致生产者重复发送该消息&#xff0c;造成了消…

常见监控网络链路和网络设备的方法

网络监控主要包括网络链路监控和网络设备监控&#xff0c;通常系统运维人员会比较关注。 一、网络链路监控 网络链路监控主要包含三个部分&#xff0c;网络连通性、网络质量、网络流量。 连通性和质量的监控手段非常简单&#xff0c;就是在链路一侧部署探针&#xff0c;去探…

二、点亮LED灯

1. 原理 想要让一个LED灯亮&#xff0c;那么就要给其供电&#xff0c;使得有电流通过 与小时候玩的一节7号电池和普通小灯泡是一个道理 2. 查看ESP32开发板电路图 通过查看电路图&#xff0c;来确定开发板上的LED等的与MCU的引脚链接方式 查看上图我们知道&#xff0c;GPIO2这…