SRE: Service Level Objectives

As we are moving from monolithic service to the micro-services, I find it pretty useful to think about the following problems:

  • How do we correctly measure the service?

This question can be breakdown into the following sub questions:

  • If you are about to maintain your service, how do you tell whether your service is functioning correctly or not?
  • If your service is a client facing product, how do you know whether you provide a good experience for the client or not?
  • How do you know your service hit the performance bottleneck or not?
  • If you are about to scale the service performance, what metric should you use to find out the performance bottleneck?

As you find out from the above sub-questions​, it all about defining the metrics for the proper client and proper scenario. For sanity check of the service, it should be quick and straightforward, for product experience check, you should rather put metric where the product impact could be measured; for performance monitoring and optimization, finding out how to measure the resource utilization and the dependent service are essential metrics.

I found that many times we didn’t measure our service correctly. And it takes time, experience and domain knowledge to find define such metrics correctly.

  • How to manage the expectation of the clients that are using our service?

One common problem for monolithic service is that the integration many times are based on direct DB or data integration, where the client treat it as local DB where the data is always available. With this setting, the failure in one domain would be contagious: as the client never assume there will be failures from the domain and when failure happens, no exception handling logic is installed to handle such failures.

To make the system more resilient, a service level agreement or expectation is truly needed. It is about setting the expectation of you service client: we are not a service that is constantly performant and reliable, we could slowdown or not available at some case, and you should be prepared for that.

So I find it is pretty useful to think about these problem​s with the SLOs and related concepts:

  • SLIs: Service Level Indicators

The service level indicators are metrics you defined to measure the behavior and performance of your service. It can be product facing or purely engineering facing.

  • SLOs: Service Level Objectives

The service level objectives are objectives that are set based on the SLIs. It serve as the direction for the team to optimize the system if necessary.

  • SLAs: Service Level Agreement

The service level agreements are more about the contract you defined for the client: how fast your service could load the data on average, and at what case you service might fail and how your client should handle such failure.

Besides defining the SLIs and SLAs, it also provides a way to validate the adoption of the SLAs. For example, if your client are supposed to handle the data access failures from your service, then you can validate that by scheduled an outage of your service. And by doing so, you push your client to adopt to the SLAs.​

货币供给的调控机制

中央银行是如何调控市场上的货币供给的呢?

中央银行的调控目标

在了解中央银行如何调控供给之前,我们先要了解为什么中央银行要进行这样的调控。以及,这样的调控是需要的吗?为什么不能完全让市场决定?中央银行是唯一合法的供给渠道,但是我们知道,如果市场上的货币供给过多就会导致通货膨胀,比如中央银行向财政部购买超出预算的债券,而如果货币供给不足就会导致货币市场上的利率增高,抑制投资和消费的需求,妨碍经济发展。但是中央银行以哪种测量量作为调控的指标和目标呢?不同的银行有不同的选择,总体上是以货币增长量和利率为主。

债券公开市场操作

中央银行调控货币流量的一个主要方式是公开债券市场回购债券。回购债券表现在家庭资产负债表上的变化是资产从债券转变成银行存款,因此市场上的货币量得以增加。在了解回购操作之前我们首先要了解一下债券这种金融产品。债券是在一段时间里保证每一时期支付一定金额的金融票据。和银行存款不同,债券是可以购买和转让的,并且购买和转让的价格取决于下面这些因素:

  • 面值:面值(face value,par value)是指债券交割的时候偿还的数量
  • 交割期限:债券到期和交割的日期,比如一年,五年,三十年等。
  • 利息和付息频率:按照利息(coupon)分比为零息债券,附息债券等,按照付息频率有比如半年付息,每年付息和一次付息等。
  • 发债者的信用水平
  • 可比较替代投资的收益水平:主要是银行存款的利息。

为了简化比较,我们现在假设债券的价格只受到其可比较替代投资品,也就是银行定期存款,的收益水平的影响,也就是说债券的价格等于其将来要产生的总收益的现值之和。未来资金的现值由当前的利率决定,比如银行利率为10%,则未来的100美元现值为100/(1+10%)=90.9,因为现在将90.9美元的资金存入银行,一年后就可以获得100美元的收益。

下面是2019年3月22日的美国国库券信息:

  • 交割期限:30年
  • 利息:3%,即每年偿付3%
  • 价格:102.52美元
  • 面值:100美元

在30年时间里一共要偿付90美元利息,最后偿还100美元本金,假设30年间年利率是3%,那么这三十年的实际总收益是多少呢?
Y = 3 + 3/(1 + 3%) + 3/(1+3%)2 + … + 3/(1+3%)29 + 100/(1+3%)29。
用下面的python 代码可以算出30年的总收益为:102.9,也就是说,这个国库券的当前价值为102.9。

par_value = 100
coupon = 3
ytm = 0
interest_rate = 0.03
for x in range(30):
    print("year {}".format(x))
    ytm += coupon/((1+interest_rate)**x)
    print("accumulated yield to this year: {}".format(ytm))
ytm += 100/((1+interest_rate)**29)
print("year to maturity {}".format(ytm))

如前面所说的,国库券可以在二级市场(secondary market)上进行交易,而中央银行可以通过在市场上的回购控制货币量。

贴现窗口

中央银行还可以通过向商业银行贷款来控制货币量。在了解贴现窗口之前我们先了解一下联邦基金市场的相关概念:

  • 联邦基金市场(federal funds market)

法律规定的商业银行必须将一部分的存款留存以降低风险,留存的这部分存款占总存款数量的比例就成为准备金率(reverse ratio)。商业银行的实际准备金可能会低于或者多出的法定的准备金,如果多出一般会将这些钱借出,如果少于法定准备金率,商业银行既可以向其他银行拆借。这些用于满足法定准备金要求的资金市场就称为联邦基金,而这个用于借出和借入的市场就称为联邦基金市场,也称为同业拆借市场。一家银行拆出和拆入的利率差就是这家银行的收益。

  • 联邦基金利率

中央银行一般会维持一定目标的同业拆借利率,也就是联邦基金利率。我们常说的美联储加息就是增加目标联邦基金利率。中央银行一般通过控制对银行持有的证券的购买来控制联邦。通过向银行回购证券,银行的资金储备会增多,因此对联邦基金的需求就会降低,联邦基金利率就会下降,反之则上升。联邦基金利率的增加会增加银行拆借成本,从而抑制银行向市场发放贷款,从而也可以降低市场上的货币量。

  • 贴现窗口和贴现率

除了同业拆借,中央银行还可以直接向商业银行借款。这个机制就成为贴现窗口(discount window),而商业银行从中央银行获得借款的利息就成为贴现率(discount rate)。银行在选择使用哪种资金来源来满足法定储备要求的时候会对各个资金来源进行比较。如果贴现窗口的利率小于商业银行的贷款利率则使用贴现窗口就是有利可图的。但是同时中间还存在交易费用和坏账的风险。

还需要提到的事,中央银行可以通过多重手段来控制市场上的货币量。比如通过贴现窗口发放了5亿美元的贷款到商业银行之后,中央银行可能通过在债券市场上放出5亿美元的债券来抵消对货币总量的影响。

另一个重要的控制手段是通过外汇的买卖来控制货币量。购买更多的外国货币会降低本国货币的存量,而出售外国货币或证券会获得更多的本国货币。这种部分操作与公开市场的操作类似。

超长期经济增长理论:索罗模型

经济为什么会增长?经济增长的差异在不同的国家地区的差异为什么如此之大?经济增长的驱动因素是什么?

首相是关于资本积累的考察。我们先假设人口和技术的因素保持静止。资本的存量重要吗?资本的存量对于产出的规模是重要的,但是对于产出的增长是不重要的。资本积累的增加与产出的增加是相关的,但是其回报是逐步下降的。比如当人均资本已经很高的时候,资本增加带来的回报将会相对较低。同时,现存资本包含折旧成本,当资本增加率和折旧率达到平衡的时候,经济将到达稳定状态。因此我们可以看到,资本的积累并不是能够维持长期经济增长的原因。

与资本的积累相关,不同国家居民的储蓄率以及财政政策也是经常被讨论的问题。以中国和美国为例,2016年中国居民的储蓄率为46%,全球平均水平为25%,而美国的储蓄率为2.5%。与此同时,2019年美国的财政赤字为9860亿美元。储蓄率,财政赤字和经济增长率有何相关性呢?较高的储蓄率意味着较高的投资水平,而较高的财政赤字将会降低居民储蓄率(较高的财政赤字说明居民收入分配中用于政府支出的部分增加,居民收入部分降低)。因此,因此较低的储蓄率和较高的财政赤字会降低经济增长的水平。

其次我们考察人口增长。注意,前面的分析都是建立在人均资本存量的模型之上的。而人口增长必然会降低人均资本存量。这种稀释效应和资本的折旧一起,将会部分抵消资本存量的增加,在稳定状态,这三者将会相互抵消。因此,在稳定状态下,投资的目的就变成了抵消资本的折旧和为新工人提供稳定状态的资本量。人口增长率的不同也部分解释了不同国家经济增长率的差异:过快的人口增长降低了人均资本存量。

经济增长的另一个驱动因素是技术进步。为了衡量技术的因此,我们在索罗模型中引入了劳动效率的概念,劳动效率和劳动力水平决定了劳动的实际产出,技术进步、经验增加都会提高劳动效率。引入了劳动效率之后的稳定状态在哪里呢?劳动效率的升高提高了有效产出,等效的,也可以认为是增加了有效工人的数量。而稳定状态就在于,新增加的有效工人的人均资本和有效产出保持不变。而技术进步的会持续带来有效工人的增加,也就是实际人均产出的增加,从而带来经济的进步。

在马克思主义的经济理论中有一个重要的推论:资本主义的经济增长将会由于随着收益的下降而放缓,从而导致金融危机,进一步的危及资本主义的政治。很明显,马克思未能注意到技术进步对经济增长的贡献。

到此为止,我们已经了解了索罗模型的基本理论。但是这当中仍然有一个问题没有解决:技术的进步是从何而来的?在索罗模型中,我们假设技术进步是外生的变量,这种假设不能解释为什么许多国家的技术进步速度明显不同。为了解释技术进步,我们引入了内生增长模型。内生模型的基本思想史引入了制造业企业和研究型大学来量化知识的增长,从而解释技术的进步。

实际利率和购买力平价

如何理解名义汇率和实际汇率的差别呢?所谓实际汇率就是两国之间产品的相对价格,比如同样的麦当劳Big Mac汉堡单点,在美国是3.99美元(非meal价格),而在中国是17元人民币,按当前6.71的中美汇率也就是2.53美元。那么一个美国汉堡可以在中国购买1.57个汉堡,就是关于汉堡的中美实际汇率。流行的Big Mac指数就是用于衡量不同国家实际汇率的一种手段。名义汇率不难理解,就是美元货币对中国货币的汇率。

衡量实际汇率有什么意义呢?最直观的一点是,实际汇率是同类的物品在不同国家的价格差异,价格差异就会带来盈利的机会。比如,如果我们把中国制作的汉堡运到美国,出去运输成本之后,仍然有盈利的可能。而这也正是国际贸易的基石之一。同样品质的汽车,如果存在实际汇率的差异,那么消费者就就会更多购买价格更低的产品。比如,如果国际产品比同类国内产品还便宜,那么消费者就会更多的购买进口产品。进一步的,由于对进口的需求增加,贸易余额就会减少。

从上面的分析我们也可以看出,实际汇率和净出口之间是存在关联关系的。实际汇率低意味着国内产品便宜,因此对进口的需求降低,净出口相对增加,反过来,实际汇率增加会导致国内产品变得更加昂贵,因此对进口的需求增加,净出口也相对减少了。

净出口等于用于购买国外产品的资金,也就是资本的净流出,而这些流出的资本又来自于储蓄减去投资之后的部分。而储蓄和投资都不取决于直接汇率,因此可以认为是相对不变的。在他们交汇的地方就是均衡的实际汇率。

  • 购买力平价的问题

在上面我们已经讨论过了,实际汇率的差异会带来盈利的机会:实际汇率的差异越大,盈利的空间就越大。那为什么没有发生实际的频繁套利呢?因为套利的前提是产品和资金的移动,这其中涉及到许多成本,在盈利空间不够覆盖这些成本的时候,套利是不存在的。但反过来说,一旦实际利率空间达到足够覆盖转移成本,套利行为就有利可图了。反过来也因此可以认为,实际汇率是区域稳定的,因为任何套利实际上都会通过改变双方市场供求关系的方式改变物品的实际价格。比如如果把中国的汉堡运往美国有利可图,中国的汉堡价格将会上升,美国的汉堡价格将会下降,从而使实际利率再次达到均衡。购买力平价的理论实际上是再说,因为你套利的可能,同样的物品在各个市场上市等价的。当然我们知道,这种假设是有很多不足之处的。

关于购买力平价的另一种误解是错误的使用了比较对象。比如经常有人拿不同国家的工资水平相比较,比如假设在美国工作的程序员年薪为25W美元,那么经常有人认为他是中国收入为185W人民币的人的行列,属于超高薪水的一类。评估他人收入水准进而判断其社会地位是不可避免的事情,在需要跨越文化进行比较大的时候,这种使用名义汇率进行的转换时非常常见的。但这种比较实际上是错误的,一则社会地位必须放在所处的社会进行比较,生活水平的跨经济体比较是可能的,但是并不具备社会地位的参考价值。第二是因为这种比较使用了名义汇率,而忽略了其实购买能力的比较应该建立在实际汇率之上。比如在中国要购买双层联排别墅所需要的价格和在美国需要的价格相比较,只能告诉我们在中国住上类似大别墅的成本如何,并不能说明我在美国享有的社会地位和在中国住联排别墅的人的社会地位相仿。但是基于实际汇率的比较可以使我们比较清楚的知道,要保持相应的生活水平需要付出的大家有多大。

经济学的学习

经济学如同社会学一样,都为我们提供了很多把握现实的基础观点。这些观点是我们理解现实的切入点。比如自由派的经济学认为,政府完全不应当干预市场,因为这只会带来无效。比如租金控制的政策导致房东可以获得的收益少于最优收益,这种差值会降低现有房东维护房屋和新房东将房屋投入租房市场的动力,最终既降低了房客的生活质量也减少了市场上可租房屋的数量,最后同时损害房东和房客两方面的利益。

但是需要注意,这些基础观点只是切入点,而非问题的终点:这些理论多数并不能完全解释实现,也不能直接指导我们获得更好的生活。在一个日益复杂的社会当中,所有问题最终都会转化为细分的专业领域,仅仅理解基础概念和理解这些领域之间和有很深的距离。那么为什还要学些他们呢?在我看来,学习这些理论的意义乃在于,我们仍有机会将他们与不同领域的理论结合来获得对现实的更好的理解和对生活的指导。

大部分时候,我们在所处职业上的努力会转化为社会地位的提升和经济状况的好转,而他们通常并不直接指导于我们职业以外的生活,也并不帮助我们理解职业以外的世界。比如计算机的学习当然对于理解信息社会是有帮助的,但是在这个领域之外,帮助就并不明显了。经济和社会理论的学习正式为了填补这样的空缺。这篇文章是我对于学习经济学的阶段性总结和反思。我希望通过这种方式来修正学习的过程。

如同其他科学一样,经济学的研究也是建立在模型之上的,研究的深入也必然伴随着对模型的不断改进。这种改进体现在不断引入新的因素,同时对不同因素的作用关系进行调整之上。随着模型变得更加复杂,对于研究者数学能力的要求也在不算加深;而由于研究的问题和对象的逐渐深入,其所探讨的内容也将逐渐超出一般生活经验的范畴。对于并不从事专业领域的工作,或者工作中并不需要专业级别经济学知识的人来说,如何选择学习的方向和程度是一个需要考虑的问题。

在我看来,对于经济学的学习需要把握这些要点:

  • 重视模型的假设,同时注意到模型中与现实不完全相符合的地方。

比如新古典经济学中对于国民收入的研究首先建立在一个封闭的经济体之上。这种经济体中包含三大主题:政府,家庭,和企业。但是我们知道,现实当中,政府并不是货币的直接入口,银行才是可贷资金市场的主要影响力量。另一方面,我们认为企业的生产完全取决于劳动力和资本,但现实中我们知道,企业的生产技术,包括税收政策都会对企业的生产能力产生影响。同时,现实中也没有完全的封闭经济体,绝大多数经济体都是和其他经济体发生直接贸易往来的。

  • 重视论证过程

同样以国民收入的研究为例。在论证的过程中,我们首先假设了企业将劳动力和生产要素转化为产品和服务的过程,进一步的,我们发现当劳动力和资本的编辑产量等于工资和租赁价格的时候,企业的产出就达到了最大化的过程。在这种情况下,如何确定经济收入在生产要素之间的分配呢?于是我们引入了市场充分竞争的假设,于是我们知道工人的实际工资等于劳动力的边际产量值,资本的回报等于资本的边际产量值。对于论证过程的理解将更好的帮助我们了解经济学的思考方式。

  • 和实际生活结合起来

要多思考所学到的经济学知识对于理解实际问题有何帮助。经济学的一个重要方面是对政府的经济政策提供指导,而很多政策背后实际上都可以找到经济学的原理。对于大多数而言,影响经济政策是一个相对遥远的目标,但是了解经济政策对于我们自身生活的影响却是可以得到理解的。

  • 细分领域和交叉领域

如同在本文开头所说的,基础的经济理论是我们深入理解社会的起点,而细分领域和交叉领域则是进一步扩展的台阶。比如,人口理论可以很好地和经济原理相结合,帮助我们更好的了解不同生育率国家所面对的问题。

最后,经济学的学习归根到底是为了让我们更好的理解现实,不要刻意追求理论的大而全面,对于一个理论的深入思考和研究,比获得一个完整的知识图谱是更为值得追求的目标。