称服务器(Dyn)已经关闭

由主要的网站都被关闭了,包括Twitter--浏览器无法解析服务器的IP地址,因为权威的名称服务器(Dyn)已经关闭。我不知道这是否能在全球范围内得到解决--有一个有趣于我增加TTL的建议--如何改进分辨率策略和算法,为什么较低的TTL并不总是适用的等等。

但是当twitter.com瘫痪的时候,移动应用程序也不起作用。虽然我们没有对浏览器的控制,但我们确实可以控制移动应用程序(当然,桌面应用程序也是如此,但我将主要谈论移动应用程序更占优势)。该应用程序也出现故障的原因是,它很可能也使用twitter.com域(例如api.twitter.com)。这是正确的做法,除非在这些罕见的情况下,当DNS失败。

在这些情况下,您可以在应用程序中硬编码服务器IP地址列表,如果基于域名的请求失败(例如,在3次尝试之后),则返回到它们。如果您更改您的服务器IP地址,您只需更新应用程序。重要的是,它将有一个不可预测的延迟(直到每个人更新)和一些客户端将没有一个适当的IP-这是一个边缘-情况回退机制。

这当然不是我的想法--它已经被像比特币和BitTorrent这样的分布式系统所使用--例如,当试图加入网络时,比特币或BitTorrent DHT客户端试图连接到一个引导节点,以便获得一个对等点列表。客户端应用程序中有一个域名列表,它使用循环DNS解析为许多已知的引导节点之一。但是,如果dns解析失败,客户端也

除了硬编码IP之外,您还可以在应用程序中定期将域解析为IP,并将“最后已知的工作IP”保存在本地缓存中。这增加了一些复杂性,不适用于新的或清洁的安装,但仍然是一个很好的措施。

  1. 主域
  2. 尝试回退域
  3. 尝试缓存最后已知的工作IP
  4. 尝试硬编码后备IP

(注意:如果连接到IP,而不是域,则应该手动验证服务器证书(假设要使用TLS连接,应该使用TLS连接)。在Android中,这是通过使用自定义来完成的HostnameVerifier.)

像Dyn攻击这样的事件是罕见的(希望如此),但对企业来说却是代价高昂的事件。向至少一些客户端软件添加后备机制是快速和容易的,并可能减少损害。

https://www.douban.com/note/813051400/

在咨询锁。这些不是通常的表锁--它们是与表无关的、特定于数据库的从应用程序中获取命名锁的方法。基本上,您使用数据库实例进行集中式应用程序级别的锁定。

它能用来做什么?如果您想拥有串行操作,这是一种相当简单的方法--不需要消息队列或应用程序层中的分布式锁定库。只需让应用程序从数据库中请求锁,其他请求(不管应用程序节点如何,万一有多个)都无法获得相同的锁。

您可以使用多个函数来获得这样的锁定实现略有不同-在MySQL中,您需要显式地释放锁,在PostgreSQL中,可以在当前事务结束时释放锁。

https://www.jianshu.com/p/29c06a072d65

如何在Java应用程序中使用它,例如Spring。您可以提供一个锁定方面和一个自定义注释来触发锁定。假设我们希望对给定实体进行顺序更新。在一般用例中,这将是奇怪的,但有时我们可能希望执行一些依赖于顺序更新的特定于应用程序的逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Before("execution(* *.*(..)) && @annotation(updateLock)")
public void applyUpdateLocking(JoinPoint joinPoint, UpdateLock updateLock) {
    int entityTypeId = entityTypeIds.get(updateLock.entity());
    // note: letting the long id overflow when fitting into an int, because the postgres lock function takes only ints
    // lock collisions are pretty unlikely and their effect will be unnoticeable
    int entityId = (int) getEntityId(joinPoint.getStaticPart().getSignature(), joinPoint.getArgs(),
            updateLock.idParameter());
     
    if (entityId != 0) {
        logger.debug("Locking on " + updateLock.entity() + " with id " + entityId);
        // using transaction-level lock, which is released automatically at the end of the transaction
        final String query = "SELECT pg_advisory_xact_lock(" + entityTypeId + "," + entityId + ")";
        em.unwrap(Session.class).doWork(new Work() {
            @Override
            public void execute(Connection connection) throws SQLException {
                connection.createStatement().executeQuery(query);
            }
        });
    }
 }

它是做什么的:

http://www.itangyuan.com/book/16222177.html

  • 它寻找带有注释的方法。@UpdateLock并应用该方面
  • UpdateLock注释有两个属性--实体类型和方法参数的名称,该参数保存我们要锁定更新的ID
  • 这个entityTypeIds基本上,在实体的字符串名称和任意数字之间有一个映射(因为Postgres函数需要一个数字,而不是一个字符串)

在一般用例中,这听起来不太有用,但如果出于任何原因,您需要确保在其他并发的多线程应用程序中按顺序执行一项功能,这是一种很好的方法。

不过,很少使用这种特定于数据库的方式获得应用程序级别的锁。如果您需要经常这样做,您可能有更大的问题-锁定通常是不可取的。在上述情况下,它只会锁定单个实体ID,这意味着很少有超过两个请求在锁处等待(或无法获得)。好处是,切分不会变得更加复杂--如果您锁定了一个特定的ID,并且它依赖于单个碎片,那么即使您可能有多个数据库实例(这些实例不共享锁),您也不必从不同的碎片中获得锁。

总之,当遇到并发问题时,要记住它是一个有用的工具。但是,在使用锁之前,请考虑一下您是否没有更大的问题。

posted @ 2021-09-21 14:57  javd9w  阅读(357)  评论(0)    收藏  举报