黑洞、发现与拒绝
爱因斯坦的卷曲时空定律预言了黑洞,爱因斯坦拒绝了这个预言。
“至于为什么‘史瓦西奇点’不存在于物理学实体中”,1939年,爱因斯坦在一篇论文中写道,“这个考察的基本结果说得很清楚了。”1爱因斯坦用这句话明确地拒绝了他自己的理性财产:他的广义相对论引力定律似乎正在预言的黑洞。
那时,根据爱因斯坦的定律还只能得到黑洞的几个性质,而“黑洞”这个名字也还没有,它们被称为“史瓦西奇点”。不过,人们已经明白,落入黑洞的任何事物不可能再逃出来,也不可能发出光或其他东西,而这已经足以让爱因斯坦和他那时代的大多数物理学家相信,黑洞是可怕的怪物,肯定不会存在于真实宇宙中。物理学定律一定会以某种方法使宇宙不受这种怪物的侵害。
爱因斯坦如此强烈地拒绝黑洞,那么,关于黑洞,他们那时都知道些什么呢?广义相对论关于黑洞存在的预言有多大力量?爱因斯坦怎么能拒绝这个预言而仍然相信他的广义相对论的定律呢?这些问题的答案有着18世纪的渊源。
在整个18世纪,科学家(那时叫自然哲学家)们相信,引力服从牛顿定律,光由光源以极高的普适速度发出的微粒(粒子)组成。通过望远镜对木卫在绕木星的轨道上所发出的光的测量,知道光速大约是每秒300 000千米。
1783年,英国自然哲学家米歇尔(John Michell)大胆地将光的微粒描述与牛顿的引力定律结合,从而预言了非常致密的星体应该是什么样的。2我把他的思想实验换个说法重复一遍:
在一颗星体的表面以某初始速度抛出一个粒子让它*向上运动。如果初始速度太低,星体引力将减慢粒子速度,使它停下来,然后将它拉回星体表面。如果初始速度足够大,引力也将使粒子慢下来,但不会使它停止,粒子将设法逃掉。回落与逃逸的界线,即为了逃逸的最小初始速度,叫“逃逸速度”。对从地球表面抛出的粒子来说,逃逸速度是每秒11千米,从太阳表面抛出的粒子,逃逸速度为每秒617千米,或光速的0.2%。
米歇尔能用牛顿的引力定律计算逃逸速度,证明它正比于星体质量除以其周长的平方根。因此,对质量一定的星体来说,周长越小,逃逸速度越大。理由很简单:周长越小,星体表面离中心越近,因而表面的引力越强,粒子为了逃脱星体的引力作用就越困难。
米歇尔推论,存在一个临界周长,对它来说逃逸速度是光速。如果光微粒像其他类型的粒子一样受引力作用,那么光几乎不能从具有临界周长的星体逃逸出去。对更小的星体光就完全不能逃逸了。如果以标准光速299 792千米/秒从这样的星体发射一颗光微粒,微粒起初会向上,然后慢慢停下来,又落回星体表面。
米歇尔能够很容易地计算临界周长。假如星体与太阳有相同质量,那么周长是18.5千米,而且随质量成比例地增大。
图3.1
米歇尔1783年用牛顿引力定律和光的微粒描述计算的从比临界周长小的星体发出的光的行为。
18世纪的物理学定律无法阻止如此致密星体的存在,因此,米歇尔猜想,宇宙中可能存在大量这样的黑(暗)星,它们都圆满地存在于自己的临界周长内,从地球看不到它们,因为从它表面发出的光微粒都被无情地拉回去了。这样的暗星就是黑洞在18世纪的形式。
米歇尔是英格兰约克郡桑希尔的教区长,1783年11月27日,他向皇家学会报告了也许存在暗星的预言。报告在英国自然哲学界产生了一点影响。13年后,法国自然哲学家拉普拉斯(Pierre Simon Laplace)在他的名著《宇宙体系论》的第1版里,通俗地提出了相同的预言,而没有提到比他更早的米歇尔的工作。在1799年的第2版里,拉普拉斯还保留了暗星的预言;但是到第3版(1808年)的时候,托马斯·杨(Thomas Young)发现了光的自干涉,1证实了惠更斯(Christiann Huygens)提出的光的波动描述,从而迫使自然哲学家们放弃光的微粒描述——不过那时还不知道如何协调波动描述与牛顿引力定律,以计算星体引力对它发出的光的作用。大概为了这个原因,拉普拉斯在第3版和后来的版本中删除了暗星的概念。3
只有在1915年11月爱因斯坦建立了广义相对论的引力定律以后,物理学家才又一次相信他们对引力和光的认识已经足以计算星体引力对它发出的光的作用了。只有在这个时候,他们才又满怀信心地转到米歇尔和拉普拉斯的暗星(黑洞)上来。
第一步是史瓦西(Karl Schwarzschild)迈出的,他是20世纪初最有名的天体物理学家。那时,他正在第一次世界大战俄国前线的德国军队服役,在1915年的《普鲁士科学院会议报告》里看到了爱因斯坦建立的广义相对论。他几乎立即就开始寻找爱因斯坦的新引力定律对星体能作出什么预言。
由于分析旋转的或非球形的星体在数学上很复杂,为了简化计算,史瓦西只考虑了完全没有旋转的球状星体,他先去找星体外部的数学描述,然后再来揭示星体的内部。几天之内,他就找到了答案。他根据爱因斯坦的新场方程,详细计算了任意无旋转球状星体外的时空曲率。他的计算简洁而优美,计算所预言的弯曲几何,很快成为大家所熟悉的史瓦西几何,注定会对我们认识引力和宇宙产生巨大的影响。
史瓦西把计算论文寄给爱因斯坦。1916年1月13日,爱因斯坦代表他在柏林普鲁士科学院的一次会议上作了报告。几个星期后,爱因斯坦向科学院报告了史瓦西的第二篇论文:关于星体内部的时空弯曲的精确计算。4仅仅4个月后,史瓦西令人瞩目的成果终止了:6月19日,爱因斯坦悲痛地向科学院报告,卡尔·史瓦西在俄国前线染病去世了。
史瓦西几何是我们在本书遇到的第一个时空弯曲的具体例子,而且对黑洞性质非常重要,所以我们要详细地来考察它。
假如我们把在空间和时间各处的所有活动都想象为一个绝对的统一的四维时空“结构”,那么,用弯曲(卷曲)的四维时空语言来描述史瓦西几何真是再恰当不过了。然而,我们日常经历的是三维空间与一维时间,它们是没有统一的;所以,我在描述中,将卷曲的时空分解为卷曲的空间加卷曲的时间。
因为空间和时间是“相对的”(如果我们彼此相对运动,则我的空间不同于你的空间,我的时间也不同于你的时间2),时空的分解首先要求选择一个参照系——也就是选择一种运动状态。对某颗星而言,我们有一种自然的选择,即令星体处于静止,也就是,我们选择星体自己的参照系。换句话说,我们来检验星体自己的空间和时间而不是某个高速经过星体的运动者的空间和时间,这是很自然的。
身穿学者长袍的卡尔·史瓦西在德国哥廷根。
[美国物理学联合会(AIP)Emilio Segrè图像档案馆提供。]
为了更形象地认识星体空间的曲率(卷曲),我将借助一种叫嵌入图的绘图方法。因为嵌入图将在以后的章节里充当重要角色,我现在通过类比来仔细介绍这个概念。
想象一族生活在只有两个空间维的宇宙中的类人生物,他们的宇宙是一个弯曲的碗面,如图3.2所示;他们也跟他们的宇宙一样,是二维的,在垂直于曲面的方向上,是无限薄的。而且,他们看不到曲面的外头,他们通过在曲面上运动而永不离开曲面的光来观察事物。于是,这些“二维生物”(我这么称呼他们)没有任何方法来获得关于他们二维宇宙以外的任何事物的任何信息。
二维生物可以通过对直线、三角形和圆的测量来探索他们二维宇宙的几何。他们的直线是第2章讨论过的“测地线”(图2.4及有关正文):他们二维宇宙中存在的最直的线。在他们宇宙的“碗”底(在图3.2中我们看到是球面的一部分),他们的直线是像地球赤道或者经线一样的大圆的一部分。在碗口以外,他们的宇宙是平坦的,所以那里的直线是我们通常所认识的直线。
图3.2 居住着二维生命的二维宇宙
如果二维生物去检验他们宇宙外部平直部分的一对平行直线(如图3.2中的L1和12),那么不论他们跟踪直线多远,都不会看到它们相交。用这个办法,他们发现外部区域是平直的。另一方面,如果他们在碗口外作平行直线L3和L4,然后跟踪两线进入碗内,尽可能让它们保持为直线(测地线),他们将看到线在碗底相交。他们用这个办法发现,在碗的内部区域,他们的宇宙是弯曲的。
通过测量圆和三角形(图3.2),二维生物也可以发现外部区域是平直的,而内部区域是弯曲的。在外部区域,所有圆的周长都等于(3.141 592 65……)乘以它们的直径。在内部区域,圆的周长小于π乘以圆的直径。例如,图3.2中近碗底的大圆的周长等于2.5乘以直径。如果二维生物以直线(测地线)为边作一个三角形,然后将三个内角相加,那么,在平直的外部区域,结果是180度;而在弯曲的内部区域,结果会大于180度。
通过这些测量,二维生物发现了他们的宇宙是弯曲的,接着他们开始推测,可能存在一个三维空间,他们的宇宙就处在——即嵌在其中。他们可能将那个三维空间叫超空间并猜想它的性质。例如,他们可能想象它在欧几里得意义上是“平直的”(其中的平行线永不相交)。你我看这个空间都没有困难,它就是图3.2中的三维空间,我们每天经历的空间。然而,二维生物因为只有二维经验,他们来看这个空间是大有困难的。而且,他们不可能有什么办法知道,这样的超曲面是否真的存在。他们不可能走出二维宇宙进入超曲面的第三维,又因为只能通过永远在宇宙中的光线来观察,所以他们永远也看不到超曲面。对他们来说,超曲面完全是假想的。
超曲面的第三维与二维生物可能也会认为是第三维的“时间维”无关。当他们想象超曲面时,实际不得不用四维的语言:两维是他们宇宙的空间,一维是它的时间,还有一维,就是超曲面的第三维。
我们是三维生物,生活在一个弯曲的三维空间里。如果我们也去测量我们在一个星体内部和附近的空间几何,史瓦西几何——我们将发现它会像二维生物的宇宙那样弯曲。
我们可以想象一个更高维的平直超曲面,我们弯曲的三维空间就嵌在其中。为了适应像我们这样的三维弯曲空间,结果,这样的超曲面必须有六个维。(记住,我们的宇宙也有一个时间维,所以总体上我们必须在七维下进行思考。)
现在,要我将我们嵌在六维超曲面中的三维空间形象地表现出来,就比二维生物表示他们嵌在三维超曲面中的二维宇宙,困难得多了。不过,有一种技巧可以帮很大的忙,如图3.3。
图3.3
用嵌入图(右下)表示的星体内部和周围(左上)的三维空间的曲率,这是爱因斯坦场方程的史瓦西解所预言的曲率。
图3.3描述了一个思想实验:将一张薄片插入一个星体的赤道平面(左上图),薄片将星体切成完全相同的上下两半。赤道薄片虽然在图中看起来还是平的,但实际上是不平的。星体的质量使星体内部和周围的三维空间发生卷曲(左上图不能表现卷曲方式),卷曲又以图中没有表现的方式使赤道片发生弯曲。我们可以完全像二维生物在他们宇宙的二维空间那样,在我们真实的物理空间中进行几何测量,从而发现薄片的曲率。这样的测量将揭示,原先平行的直线在星体中心附近相交,任何星体内部或附近的圆的周长小于π乘以其直径,三角形内角和大于180度。弯曲空间的这些古怪事情都是爱因斯坦方程的史瓦西解预言的。
为了形象地表现史瓦西曲率,我们可以像二维生物那样,想象将赤道片从我们宇宙弯曲的三维空间中取出来,然后将它嵌入一个假想的平直的三维超曲面(图3.3右下)。在没有弯曲的超曲面中,薄片只有向下弯曲成碗状,才能保持它的弯曲几何。这样从我们弯曲宇宙中取出来嵌入假想的三维平直超曲面的二维薄片图,就叫嵌入图。
将超曲面的第三维想象为我们自己宇宙的第三个空间维是很诱人的,但我们必须拒绝这种诱惑。超曲面的第三维与我们自己宇宙的任何一维都没有任何关系,那一维我们既走不进也看不见,也不能从它得到任何信息,是纯假想的一维。不过,它还是有用的。它可以帮助我们看见史瓦西几何,而且在本书后面它还将帮助我们看见其他的弯曲几何:黑洞的、引力波的、奇点的和虫洞的(见6,7,10,13和14章)。
如从图3.3的嵌入图所看到的,星体赤道片的史瓦西几何在定性上同二维生物宇宙的几何是一样的:在星体内部,几何是碗状弯曲的,在远离星体的地方,几何是平直的。跟在二维生物的碗内的大圆(图3.2)一样,在这儿(图3.3),星体的周长除以直径也小于π。对我们的太阳而言,它预言周长与直径之比比π小百万分之几;换句话说,在太阳内部,空间在百万分之几以内的精度上是平直的。然而,假如让太阳保持相同的质量而周长越来越小,那么它内部的曲率会越来越大,图3.3的嵌入图的碗的下凹将更显著,周长与直径之比将大大地小于π。
因为在不同参照系中空间的曲率不同(“如果我们彼此相对运动,你的空间是我的空间和我的时间的混合”),所以在相对于星体以高速度运动的参照系中和在星体处于静止的参照系中所测量的星体空间弯曲的细节是不同的。在高速参照系的空间里,星体在垂直于运动的方向上以某种方式被压扁了,所以嵌入图很像图3.3的,但碗被横向挤压成为长椭圆形。压扁是弯曲空间发生了菲兹杰拉德在无引力宇宙中所发现的空间收缩的结果(见第1章)。
爱因斯坦场方程的史瓦西解不仅描述了空间的曲率(或卷曲),还描述了星体附近的时间卷曲——由星体的强大引力产生的卷曲。在相对于星体静止或飞行速度不高的参照系中,时间卷曲完全是第2章讨论过的引力时间膨账(卡片2.4及相关讨论):靠近星体表面的时间流比远处的慢,而在星体中心,时间流更慢。
在太阳的情形,时间卷曲很小:在太阳表面,时间流只比远离太阳慢百万分之二(1年慢64秒),而在太阳中心,它比在远处慢大约十万分之一(1年慢5分钟)。然而,如果太阳保持相同质量而周长更小,表面离中心更近,那么引力作用会更强,相应地,它的引力时间膨胀——时间卷曲——将变得更大。
时间卷曲的一个结果是,从恒星发出的光会经历引力红移。因为光的振荡频率由光发射处的时间流决定,从星体表面的原子发出的光在到达地球时,将比从星际空间的同类原子发出的光具有更低的频率。频率降低的量完全与时间流变慢的数量相同。较低的频率意味着较大的波长,所以,来自星体的光必然会以星体表面时间膨胀的数量向光谱的红端移动。
在太阳表面,时间膨胀为百万分之二,所以,从太阳到达地球时,光的引力红移也是百万分之二。在爱因斯坦时代,这么小的红移是不能确定地测量的。但在60年代初,实验技术赶上了爱因斯坦的引力定律:普林斯顿大学的布劳特(Jim Brault)用一个精巧的实验测量了太阳光的红移,得到了与爱因斯坦预言非常一致的结果。
在史瓦西过早去世后的几年里,他的时空几何成了物理学家和天体物理学家的标准研究工具。包括爱因斯坦在内的大多数人都在研究它,估量它的意义。所有的人都同意而且重视这样的结论,如果星体像太阳那样有很大的周长,那么它内部和周围的时空只会出现很小的弯曲,从它表面发出而在地球接收的光向红色方向的移动会更少。他们也同意,如果星体越致密,那么它的时空卷曲越大,从它表面发出的光的引力红移也越大。不过,很少有人愿意认真去考虑史瓦西几何在高致密星体情况下的那些极端预言(图3.4)。
史瓦西几何预言,每个星体都存在一个依赖于星体质量的临界周长——与米歇尔和拉普拉斯在一个多世纪以前发现的那个临界周长相同:18.5公里乘以以太阳质量为单位的星体质量。如果星体的实际周长大于这个临界值的4倍(图3.4上),那么星体空间将像途中表现的那样适度弯曲,它表面的时间流会比远处的慢15%,从表面发出的光也会向红端移动15%。如果星体周长较小,只是临界值的2倍(图3.4中),它的表面将更强烈地弯曲,表面的时间会比远处的慢41%,表面发出的光也将红移41%。这些预言看来都是合理的,可以接受的。在20年代甚至60年代末的物理学家和天体物理学家们看来根本不合理的,是在实际周长与临界值相同的星体情况下的预言(图3.4下)。这样一个星体,因为它更强烈弯曲的空间,表面的时间流无限地膨胀,时间根本不流了——冻结了。相应的是,不论从星体表面出发向上旅行的光开始是什么颜色,它都一定会移过光谱的红端,超越红外线,超越无线电波的波长,一直到无限大,就是说,直到不存在。用现代语言来说,具有临界周长的星体表面正好处在黑洞的视界;而星体以它强大的引力产生一个包围它自身的黑洞视界。
图3.4
广义相对论对空间曲率和光的红移的预言,光线来自3个质量相同而周长不同的高度致密的星体。第1个星体的周长是临界周长的4倍;第2个是临界周长的2倍;第3个正好具有与临界值相同的周长。用现代语言说,第3个星体的表面是黑洞的视界。
史瓦西几何论证的基本观点与米歇尔和拉普拉斯发现的相同:像临界周长那么小的星体,从远处看来,必然完全是黑的;一定是我们现在所说的黑洞。尽管基本结果相同,但机理完全不同。
米歇尔和拉普拉斯基于牛顿的空间和时间绝对而光速相对的观点相信,对刚好比临界周长小一点儿的星体,光微粒几乎逃逸了。它们会飞到离星体很远的高度,比任何行星轨道还高;但当它们向上爬的时候,将被星体引力减慢,停在某个尚未达到星际空间的地方,然后调头,被拉回星体。尽管在沿轨道运动的行星上的生物可以通过减速的光看到这颗恒星(对他们来说,它不是黑的),但我们生活在遥远地球上的人却根本看不到它,星光不能到达我们。对我们来说,星体是黑的。
相反,史瓦西的时空曲率要求光总是以相同的普适速度传播,永远也不会变慢。(光速是绝对的,但空间和时间是相对的。)但是,如果光是从临界边界发出的,那么,当它向上经过无限小的距离时,它的波长必然产生无限大的移动。(波长移动之所以无限大,是因为时间流在视界处是无限膨胀的,而波长总是以与时间膨胀相同的量移动。)波长无限大移动的结果是消耗了所有的光能,因此光也不复存在了!这样,不论行星离临界边界多近,它上面的生物也根本看不见从星体发出的光。
我们将在第7章研究,从黑洞临界面内部看,光的行为是怎样的。我们会发现,光毕竟没有消失,它只不过是不能逃出临界面(黑洞的视界),尽管它仍在以标准的、普适的每秒299792公里的速度向外运动。但是,本书才开头,我们还不能很好地理解这种看似矛盾的行为。现在,我们必须首先建立对他事物的认识,这也是从1916到1960年这几十年间物理学家们所做的。
在20年代和进入30年代后,世界上最有名的广义相对论专家是爱因斯坦和英国天文学家爱丁顿(Arthur Eddinglon)。虽然別人也懂相对论,似爱因斯坦和爱丁顿为这个学科定下了理性的基调。在有人愿意把黑洞当真时,爱因斯坦和爱丁顿不愿意。黑洞就是“味不对”,它们太奇怪了;它们违背了爱因斯坦和爱丁顿关于我们的宇宙应该如何表现的直觉。
爱因斯坦在20年代似乎已经研究过这个问题,却将它忽略了。那时候,没人认为黑洞是什么重要的预言,所以也没有多大必要为此清理这些事情。而且因为別的自然之谜更有趣,更令人困惑,所以爱因斯坦把精力放到了别的地方。
爱丁顿在20年代的方法更天真。他像个业余演员,喜欢普及科学;只要没人把黑洞太当真,它们就是在别人面前摇摆的玩物。于是,我们看到他在1926年的《恒星的内部结构》一书中写道,没有什么可观察的星体能比临界周长的星更致密:“第一,引力的作用会大得连光也不能从它逃逸,光线会像石头落回地球那样落回恒星。第二,谱线的红移会大得连它的谱都不存在了。第三,质量会产生很大的时空度规的曲率,使空间封闭起来,将星体包在里面,而将我们留在外头(不知那是什么地方)。”第一个结论是光不能逃逸的牛顿式说法;第二个结论是半精确的相对论表达;而第三个结论就是典型的爱丁顿式的夸张了。我们从图3.4的嵌入图已经清楚地看到,当星体像临界周长那么小时,空间弯曲是很强烈的,但还不是无穷大,空间当然也不会卷起来包围星体。爱丁顿大概是知道这一点的,但他的描述很动听,在天真和幽默中把握了史瓦西时空曲率的精神。
我们将在第4章看到,在30年代,要求认真考虑黑洞的压力开始增加了。随着压力的增加,爱丁顿、爱因斯坦和其他一些“一言九鼎”的人物开始明确表示他们对这些怪物的反对。
1939年,爱因斯坦发表了一篇广义相对论的计算文章,作为一个例子,他解释了为什么黑洞不能存在。7他的计算分析了人们也许想过可以用来制造黑洞的一类理想物体。那是一个靠引力相互吸引从而聚在一起的粒子集,很像太阳通过引力作用于它的行星而将太阳系团结在一起。爱因斯坦集合的粒子都沿圆轨道围绕一个共同的中心运动,它们的轨道形成一个球面,球面上一端的粒子靠引力吸引着另一端的粒子(图3.5左)。
爱因斯坦想象,让集合越来越小,将实际周长向临界周长压缩。正如我们所预料的,他的计算表明,集合越紧密,球面的引力越强,在球面上运动的粒子为不至被引力拉进去,一定会运动得更快。爱因斯坦证明如果集合小于1.5倍临界周长,引力将非常强大,为避免被它吸进去,粒子不得不比光还跑得快。因为没有东西能比光运动得更快,所以粒子集不可能比1.5倍临界值还小。“至于为什么‘史瓦西奇点’不存在于物理学实体中”,爱因斯坦写道,“这个考察的基本结果说得很清楚了。”
作为对自己观点的支持,爱因斯坦还借助了一个其物质密度为常数的理想星体的内部结构(图3.5右)。这样的星体靠它内部气体的压力而避免坍缩。史瓦西曾用广义相对论导出了这种星体的完备的数学描述,他的公式表明,如果让星体越来越紧密,那么,为了反抗内部引力强度的增大,星体内部的压力也一定会
推荐阅读
-
IEEE TIP 2022 | 基于成分区域发现和区域间关系建模的食品图像识别与成分预测
-
(b) 发现公司简称与公司全称一致
-
什么是数据库事物?为什么需要数据库事物,事物有哪些特征?事物的隔离级别是什么?-1.什么是数据库事务? 1.事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须具备四个属性,即ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为事务: 原子性 2.事务必须是一个原子工作单元;它的数据修改要么全部执行,要么全部不执行。 一致性 3.事务完成时,所有数据必须保持一致。在相关数据库中,所有规则都必须适用于事务的修改,以保持所有数据的完整性。事务结束时,所有内部数据结构(如 B 树索引或双向链接表)必须正确无误。 隔离 4.并发事务的修改必须与其他并发事务的修改隔离。一个事务会在另一个并发事务修改之前或之后查看某一状态下的数据,而不会查看中间状态下的数据。这就是所谓的可序列化,因为它允许重新加载起始数据和重放一系列事务,从而使数据最终处于与原始事务执行时相同的状态。 持久性 5.事务完成后,它对系统的影响是永久性的。即使在系统发生故障的情况下,修改也会保留。 2. 为什么需要数据库事物,事物有哪些特征? 事物对数据库的作用是对数据进行一系列操作,要么全部成功,要么全部失败,防止出现中间状态,确保数据库中的数据始终处于正确、和谐的状态。 特征:原子性、一致性、隔离性、持久性,以及其他特征 原子性(Atomicity):所有操作在事务开始后,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出现错误时,会回滚到事务开始前的状态,所有操作就像没有发生一样。也就是说,事务是一个不可分割的整体,就像化学中的原子一样,是物质的基本单位。 一致性(Consistency):在事务开始之前和结束之后,数据库的完整性约束都没有被破坏。例如,如果 A 转钱给 B,A 不可能扣除这笔钱,但 B 却没有收到这笔钱。 隔离:在同一时间内,只允许一个事务请求相同的数据,不同事务之间没有干扰。例如,甲正在从一张银行卡上取款,在甲取款过程结束之前,乙不能向这张卡转账。 持久性(耐用性):事务完成后,事务对数据库的所有更新都将保存到数据库中,无法回滚 3.事务的隔离级别有哪些? 数据库事务有四种隔离级别,从低到高分别是未提交读取(Read uncommitted)、已提交读取(Read committed)、可重复读取(Repeatable read)、可序列化(Serializable)。此外,事务的并发操作中可能会出现脏读、不可重复读、幽灵读等情况。事务并发问题 脏读:事务 A 读取事务 B 更新的数据,然后事务 B 回滚操作,那么事务 A 读取的数据就是脏数据。 不可重复读取:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取期间更新并提交数据,导致事务 A 多次读取同一数据时结果不一致。 幻影读取:系统管理员 A 将数据库中所有学生的具体分数改为 ABCDE 等级,但系统管理员 B 在此时插入了具体分数的记录,当系统管理员 A 更改结束后发现仍有一条记录未被更改,仿佛发生了幻觉,这称为幻影读取。 小结:不可重复读和幻读容易混淆,不可重复读侧重于修改,幻读侧重于增删。解决不可重复读问题只需锁定满足条件的行,解决幻读问题则需要锁定表 MySQL 事务隔离级别
-
epoll简介及触发模式(accept、read、send)-epoll的简单介绍 epoll在LT和ET模式下的读写方式 一、epoll的接口非常简单,一共就三个函数:1. int epoll_create(int size);创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close关闭,否则可能导致fd被耗尽。2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);epoll的事件注册函数,它不同与select是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create的返回值,第二个参数表示动作,用三个宏来表示:EPOLL_CTL_ADD:注册新的fd到epfd中;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */};events可以是以下几个宏的集合:EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭); EPOLLIN事件:EPOLLIN事件则只有当对端有数据写入时才会触发,所以触发一次后需要不断读取所有数据直到读完EAGAIN为止。否则剩下的数据只有在下次对端有写入时才能一起取出来了。现在明白为什么说epoll必须要求异步socket了吧?如果同步socket,而且要求读完所有数据,那么最终就会在堵死在阻塞里。 EPOLLOUT:表示对应的文件描述符可以写; EPOLLOUT事件:EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那要先准备好下面条件:1.某次write,写满了发送缓冲区,返回错误码为EAGAIN。2.对端读取了一些数据,又重新可写了,此时会触发EPOLLOUT。简单地说:EPOLLOUT事件只有在不可写到可写的转变时刻,才会触发一次,所以叫边缘触发,这叫法没错的!其实,如果真的想强制触发一次,也是有办法的,直接调用epoll_ctl重新设置一下event就可以了,event跟原来的设置一模一样都行(但必须包含EPOLLOUT),关键是重新设置,就会马上触发一次EPOLLOUT事件。1. 缓冲区由满变空.2.同时注册EPOLLIN | EPOLLOUT事件,也会触发一次EPOLLOUT事件这个两个也会触发EPOLLOUT事件 EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);EPOLLERR:表示对应的文件描述符发生错误;EPOLLHUP:表示对应的文件描述符被挂断;EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);等待事件的产生,类似于select调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。-------------------------------------------------------------------------------------------- 从man手册中,得到ET和LT的具体描述如下EPOLL事件有两种模型:Edge Triggered (ET)Level Triggered (LT)假如有这样一个例子:1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符2. 这个时候从管道的另一端被写入了2KB的数据3. 调用epoll_wait(2),并且它会返回RFD,说明它已经准备好读取操作4. 然后我们读取了1KB的数据5. 调用epoll_wait(2)......Edge Triggered 工作模式:如果我们在第1步将RFD添加到epoll描述符的时候使用了EPOLLET标志,那么在第5步调用epoll_wait(2)之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。只有在监视的文件句柄上发生了某个事件的时候 ET 工作模式才会汇报事件。因此在第5步的时候,调用者可能会放弃等待仍在存在于文件输入缓冲区内的剩余数据。在上面的例子中,会有一个事件产生在RFD句柄上,因为在第2步执行了一个写操作,然后,事件将会在第3步被销毁。因为第4步的读取操作没有读空文件输入缓冲区内的数据,因此我们在第5步调用 epoll_wait(2)完成后,是否挂起是不确定的。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。最好以下面的方式调用ET模式的epoll接口,在后面会介绍避免可能的缺陷。 i 基于非阻塞文件句柄 ii 只有当read(2)或者write(2)返回EAGAIN时才需要挂起,等待。但这并不是说每次read时都需要循环读,直到读到产生一个EAGAIN才认为此次事件处理完成,当read返回的读到的数据长度小于请求的数据长度时,就可以确定此时缓冲中已没有数据了,也就可以认为此事读事件已处理完成。Level Triggered 工作模式相反的,以LT方式调用epoll接口的时候,它就相当于一个速度比较快的poll(2),并且无论后面的数据是否被使用,因此他们具有同样的职能。因为即使使用ET模式的epoll,在收到多个chunk的数据的时候仍然会产生多个事件。调用者可以设定EPOLLONESHOT标志,在 epoll_wait(2)收到事件后epoll会与事件关联的文件句柄从epoll描述符中禁止掉。因此当EPOLLONESHOT设定后,使用带有 EPOLL_CTL_MOD标志的epoll_ctl(2)处理文件句柄就成为调用者必须作的事情。然后详细解释ET, LT:LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.ET(edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK 错误)。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark确认(这句话不理解)。在许多测试中我们会看到如果没有大量的idle -connection或者dead-connection,epoll的效率并不会比select/poll高很多,但是当我们遇到大量的idle- connection(例如WAN环境中存在大量的慢速连接),就会发现epoll的效率大大高于select/poll。(未测试)另外,当使用epoll的ET模型来工作时,当产生了一个EPOLLIN事件后,读数据的时候需要考虑的是当recv返回的大小如果等于请求的大小,那么很有可能是缓冲区还有数据未读完,也意味着该次事件还没有处理完,所以还需要再次读取: 这里只是说明思路(参考《UNIX网络编程》) while(rs) {buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);if(buflen < 0){// 由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可读// 在这里就当作是该次事件已处理处.if(errno == EAGAIN)break; else return; }else if(buflen == 0) { // 这里表示对端的socket已正常关闭. } if(buflen == sizeof(buf) rs = 1; // 需要再次读取 else rs = 0; } 还有,假如发送端流量大于接收端的流量(意思是epoll所在的程序读比转发的socket要快),由于是非阻塞的socket,那么send函数虽然返回,但实际缓冲区的数据并未真正发给接收端,这样不断的读和发,当缓冲区满后会产生EAGAIN错误(参考man send),同时,不理会这次请求发送的数据.所以,需要封装socket_send的函数用来处理这种情况,该函数会尽量将数据写完再返回,返回-1表示出错。在socket_send内部,当写缓冲已满(send返回-1,且errno为EAGAIN),那么会等待后再重试.这种方式并不很完美,在理论上可能会长时间的阻塞在socket_send内部,但暂没有更好的办法. ssize_t socket_send(int sockfd, const char* buffer, size_t buflen) { ssize_t tmp; size_t total = buflen; const char *p = buffer; while(1) { tmp = send(sockfd, p, total, 0); if(tmp < 0) { // 当send收到信号时,可以继续写,但这里返回-1. if(errno == EINTR) return -1; // 当socket是非阻塞时,如返回此错误,表示写缓冲队列已满, // 在这里做延时后再重试. if(errno == EAGAIN) { usleep(1000); continue; } return -1; } if((size_t)tmp == total) return buflen; total -= tmp; p += tmp; } return tmp; } 二、epoll在LT和ET模式下的读写方式 在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是: * EAGAIN: 再试一次 * EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block * perror输出: Resource temporarily unavailable 总结: 这个错误表示资源暂时不够, 可能read时, 读缓冲区没有数据, 或者, write时,写缓冲区满了 。 遇到这种情况, 如果是阻塞socket, read/write就要阻塞掉。 而如果是非阻塞socket, read/write立即返回-1, 同 时errno设置为EAGAIN. 所以, 对于阻塞socket, read/write返回-1代表网络出错了. 但对于非阻塞socket, read/write返回-1不一定网络真的出错了. 可能是Resource temporarily unavailable. 这时你应该再试, 直到Resource available. 综上, 对于non-blocking的socket, 正确的读写操作为: 读: 忽略掉errno = EAGAIN的错误, 下次继续读 写: 忽略掉errno = EAGAIN的错误, 下次继续写 对于select和epoll的LT模式, 这种读写方式是没有问题的. 但对于epoll的ET模式, 这种方式还有漏洞. epoll的两种模式 LT 和 ET
-
谈API网关和应用网关--从技术选型谈起:API网关的性能是第一指标,一般会选择Kong、Apisix等基于OpenResty+Lua的高性能网关(得益于Ngnix基于C++的高性能无阻塞网络IO模型),应用网关一般是结合自身业务的技术栈来选择,比如SpringCloud Gateway、Zuul等。当然,这也不是绝对的,如果你对 Kong 非常熟悉,用它来做应用网关也不是不可能。 一些开源网关项目的例子: Kong Apisix 特使 Traefik SpringCloud 网关 Zuul / Zuul2 接下来,我们将重点介绍应用网关。在网格中,应用网关侧重于以下功能(与 API 网关不同) 动态路由 服务发现 服务聚合/协调 可观察性 如果您使用的是 Sping 技术栈,使用 SpringCloud Gateway 和 Zuul 可以轻松重用现有类库,如集成您的注册表,使用 Hystrix、resilience4j 完成熔断和限流功能等,快速完成一个生产级可用应用网关,如果引入新的复杂技术栈 成本将直线上升。根据使用场景的不同,性能有时并不是第一指标,但通常我们很容易陷入性能误区。
-
黑洞、发现与拒绝
-
在类路径上发现与 Spring Cloud Gateway 不兼容的 Spring MVC。
-
Kafka 高可用性之谜:深入剖析其架构原理和关键技术--副本数量与分布:适当增加副本数量可以提高容错能力,但会增加网络开销和存储成本。合理分配副本,保证副本在不同Broker上尽可能分散,可以降低单点故障的影响。 数据复制策略:Kafka 支持同步复制(在响应客户端之前同步 ISR 中的所有副本)和异步复制(响应客户端后异步复制到其他副本)。同步复制提供更强的数据一致性,但会牺牲写性能;异步复制则相反。根据业务对一致性和性能的需求,选择合适的复制策略。 监控和报警:实时监控代理、分区和复制状态,设置阈值警报,及时发现并处理异常情况,是保证高可用性的必要条件。 V.总结
-
iCloud 切换区域,中国区保留 appStore(更新)--自 2018 年 2 月 28 日起,中国区 iCloud 由云上贵州管理 苹果公司发布的公告 https://support.apple.com/zh-cn/HT208352 关键词 关键部分 受影响的 iCloud 账户:国家或地区设置为 "中国 "的 Apple ID。 iCloud 包含的服务照片、邮件、通讯录、日历、提醒事项、备忘、书签、钱包、钥匙串、云备份、云驱动器、应用程序数据 新条款和条件: 同意仅出于本协议允许的目的并在中国法律允许的范围内使用服务。 云桂洲在提供服务时应使用合理的技能并尽职尽责,但在适用法律允许的最大范围内,我们不保证或担保您通过本服务存储或访问的任何内容不会意外损坏、崩溃、丢失或根据本协议的条款被删除,如果发生此类损坏、崩溃、丢失或删除,我们不承担任何责任。您应自行负责维护您的信息和数据的适当备份。 Apple 和云上贵州有权访问您存储在服务中的所有数据,包括有权根据适用法律相互之间共享、交换和披露所有用户数据(包括内容)。 本协议的解释、效力和履行应适用*法律。对于因本协议引起的或与本协议有关的任何争议,云桂洲和您同意提交中国国际经济贸易仲裁委员会(CIETAC)根据提交仲裁时有效的法律在北京进行具有约束力的仲裁。 由云桂洲管理,用户选择: 停用; ID 到地区; 受 iCloud(由云桂洲运营)条款和条件约束 首先,我想说说我对数据安全的看法。 当我在朋友圈发布通知时,有些朋友回复说国外的操作并没有多安全,或者国外的安全只是相对于国外而言的等等。首先,我非常感谢这些朋友,这让我反思什么是数据安全。以下观点均属个人观点: 国外的月亮一定比国内圆? 这是一个根深蒂固的问题,只要有人说国外的东西比国内好,就会有人嘲笑崇洋媚外。我觉得我们在某些方面应该向国外学习,比如搜索引擎和版权问题。打开百度搜索 "数据安全",第一行肯定是广告。打开谷歌搜索 "数据安全",第一条就是 "数据安全_百度百科" .....各种版权问题大家都明白,支持正版,但不仅客户一心想找免费破解,就连作者也往往没有保护自己劳动成果或产品的想法。但从另一个层面来说,国内的发展和安全,甩国外几条街。没有说哪里好,哪里不好,辩证地去学习更好。 国外也有别有用心的数据泄露,谈何安全? 从加密解密的角度看,自古以来就没有绝对安全的加密,只有相对安全的做法。苹果的棱镜门、微软的 cpu 漏洞,各种参差不齐的被破解案例 ....是的,这的确是一个很好的论据,但凡事都不能只看一面,当年苹果面对FBI破解手机的要求,几经论证,苹果还是拒绝破解。这点拿到国内,只要上面的文件传达下去,还有企业敢说不吗?还敢说不吗? 关于这次iCloud数据迁移个人看法? 把数据迁移到贵州的云端,相当于把手机的所有数据都存储在贵州的云端服务器上。也许访问数据的速度会快很多,但我会把我的iCloud区放到美国,因为我不想数据存在云上贵州后经常接到莫名其妙的电话或短信,更不想因为乱用国外服务器而被请去喝茶。iCloud一个ID,即从中国账号转到美国区,主要用于数据存在美国服务器上。appStore一个ID,除了注册一个中国ID外,专门用来下载应用用,因为国外ID不支持酷狗和网易云等应用。麻烦的是,用了新的 appStore ID 后,当前的应用还得重新下载安装,因为旧的应用 ID 与新的应用 ID 不兼容,安装不了。最后,iCloud迁移后,国内用户使用美国服务器,估计要 "扶墙 "了。 专业步骤: 首先,进行appleID设置,这是前提条件,否则无法选择转移区域! 取消 appleID 的双重认证 取消家庭共享选项 二、窗口下载并安装 icloud 3.0 版
-
小红书大产品部架构 小红书产品概览--经过性能、稳定性、成本等多个维度的详细评估,小红书最终决定选择基于腾讯云星海自研硬件的SA2云服务器作为主力机型使用。结合其秒级的快速扩缩、超强兼容和平滑迁移能力,小红书在抵御上亿次用户访问、保证系统稳定运行的同时,也实现了成本的大幅降低。 星海SA2云服务器是基于腾讯云星海的首款自研服务器。腾讯云星海作为自研硬件品牌,通过创新的高兼容性架构、简洁可靠的自主设计,结合腾讯自身业务以及百万客户上云需求的特点,致力于为云计算时代提供安全、稳定、性能领先的基础架构产品和服务。如今,星海SA2云服务器也正在为越来越多的企业提供低成本、高效率、更安全的弹性计算服务。 以下是与小红书SRE总监陈敖翔的对话实录。 问:请您介绍一下小红书及其主要商业模式? 小红书是一个面向年轻人的生活方式平台,在这里,他们发现了向上、多元的真实世界。小红书日活超过 3500 万,月活跃用户超过 1 亿,日均笔记曝光量达 80 亿。小红书由社交平台和在线购物两大部分组成。与其他线上平台相比,小红书的内容基于真实的口碑分享,播种不止于线上,还为线下实体店赋能。 问:围绕业务发展,小红书的系统架构经历了怎样的变革和演进? 系统架构变化不大,影响最深的是资源开销。过去三年,资源开销大幅增加,同比增长约 10 倍。在此背景下,我们努力进行优化,包括很早就开始使用 K8S 进行资源调度。到 18 年年中,绝大多数服务已经完全实现了容器化。 问:目前小红书系统架构中的计算基础设施建设和布局是怎样的? 我们目前的建设方式可以简单描述为星型结构。腾讯云在上海的一个区是我们的计算中心,承载着我们的核心数据和在线业务。在外围,我们还有两个数据中心进行计算分流,同时承担灾备和线上业务双活的角色。 与其他新兴电子商务互联网公司类似,小红书的大部分计算能力主要用于线下数据分析、模型训练和在线推荐等平台。随着业务的发展,对算力的需求也在加速增长。