您好 我们可以现在开始了吗大家好 非常开心大家能够来到KLSMASH的每天的track然后 要我们现在开始吧我们这次的主题其实是KLSMASH 概览 实践和未来我们会简单地介绍一下婚能工程以及KLSMASH是什么然后以及介绍一下KLSMASH在冰咖啡和腾讯中内部实践然后我们再来展望一下这个项目的未来发展我们先请讲者做一下自我介绍吧大家好 我叫英成文 来自拼泰普目前在拼泰普负责Cloud Infra 相关的事情也是KLSMASH这个项目的名牌我叫高相林然后我现在那个腾讯工作之前我是在阿里云然后我是比较喜欢就是说婚能工程还有执行管理这一块然后大家如果联系我的话可以联系我的邮箱谢谢大家大家好 我叫周志强我剪了个头发我之前是比较长的话然后我是KLSMASH的Mentender然后之前也在拼泰普工作然后现在的状态是一个独立开发者我们今天的议题大概是这样在开始我们这是议题之前有一个问题就是现在在场的大家大家有多少已经听说过婚能工程或者说用过KLSMASH类似的工具可以几个时候看一下吗然后还有相当多的那我再问一下大家有多少同学在自己的生产环境上做过婚能工程来哇 很厉害 很厉害很厉害 为我还背负这次我们的议题其实还是相当于稍微简单一点配上于一个大致的概览然后以及介绍一下KLSMASH怎么工作的然后我们最后会有一个QA环节如果我们时间来得及的话我们可以交流一下问题首先我们介绍一下婚能工程它是什么我们背景是这样的在随着云元生和微服务的普及应用程序的复杂性其实正在日益的增加在这种情况下进行确定性的测试其实是仅使用确定性的测试来确保应用的稳定性或者它的功能符合预期其实变得非常困难而且几乎很难去覆盖所有现实中可能遇到所有故障这就是我们为什么需要婚能工程通过模拟一些真实的世界中会遇到的故障婚能工程可以帮助我们更好的理解以及改进我们的系统而且我们还必须意识到一件事情就是故障随时都有可能发生最常见的例子可能就是Gate Hub我们众所周知Gate Hub最近一段时间非常不稳定仅在过去8月和9月的时间我们经过统计的故障次数就到达了37次这件事情其实在提醒我们无论是我们的系统已经非常复杂了然后我们的infra可能也已经非常完善但是在这种情况下故障还是怎么会发生还有一个挺有意思的事情就是Elon Musk在Google推特以后他进行了一个非常aggressive的一个事情就是将他们的服务器从萨拉门托迁移到俄罗钢他在迁移的时候就简单地测试了一下拔了几个电源然后发现服务没有问题然后就把整个服务器的机器全部欠过去了然后后来推特的这些可能性大家可能也知道也就是说其实无论是自然也好还是人文也好都会导致故障这种发生这其实不仅体现了我们需要深入理解系统的行为以及我们对它的干涉也需要也一定承受体现了如果我们之前做混沌工程的话也可以往我们预防以及应对这种故障方面混沌工程会带来这样的价值然后让我们简单来了解一下混沌工程混沌工程它其实是一个在经验基础上做实验的学科它其实是在受控环境中通过精心设计的实验方式来打破我们事物的一种方法通过这种方式我们用来增强我们对应用在面对动荡条件时是否稳定了这么一个信心然后需要强调到几点是混沌工程并不是随机的没有目的的随意破坏事物它是一种科学的方法它是通过实验的方式来解释系统的弱点从而让我们提高对系统的稳定性和可耗性在进行混沌实验时我们需要明确实验的目标是什么精心设计实验方案并且在实验结束以后进行详细的分析才能获取到有价值的信息如何帮助我们提高目前的系统混沌工程的历史可以追溯到2010年当时Netflix创建了挺有名的Kiosk Monkey混沌猴子这是一个自动化的工具它其实当时做的事情很简单因为当时AWS还没有现在这么稳定它做的事情就是随机的关闭EC2然后来测试系统的弹性再往后在这个基础上Netflix出了一些ARMEA还有Kiosk Kong这种内部的工具然后有一个比较著名的直引的条件叫做Principal Kiosk Monkey这个指导的理念出现了然后大家可以看到2017年左右以后有一些开源的项目开始出现然后直到最近2021年以后各大云服务商开始推出他们的云上的混沌工程的工具和服务好 然后我们来介绍一下Kiosk Mesh它是一个什么样的项目Kiosk Mesh是一个开源的混沌工程平台它在基于Kubernetes它在Kubernetes上进行混沌实验提供了全面和易于使用的工具链然后Kiosk Mesh使用CRDCustom Resource Definition的方式来定义混沌实验类型并且提供了非常丰富的故障注入的方法包括Pod的故障Pod的故障网络的故障始终故障和DNS故障等等然后我们还可以通过Kiosk D在虚拟机或者是物理机上进行故障模拟Kiosk Mesh也提供了调度的机制也可以按照指定的时间或者是使用工作流来管理多个实验我们来看一下Kiosk Mesh的主要特性Kiosk Mesh首先说提供了多样的混沌实验我刚才提到了Pod KiosNetable KiosIo KiosDNS KiosTime KiosGBM Kios等等这些都是以CRD的形式来定义的也就是说你写一个压谋就可以实现一个实验Kiosk Mesh还提供了Node级别的一些混沌故障就是刚才提到的Kiosk D工具我们可以注入进程级别的故障网络故障 压力场景以及刺盘错误等等并且Kiosk Mesh还提供了Kiosk Mesh使用CRD来定义我们的实验类型它其实是专用的而且是可预测的混沌实验而且我们提供了调度和工作流的能力可以按照预期设计混沌实验并且Kiosk Mesh还要提供了一个web UI我们叫Kios Dashboard我们可以通过这个界面来管理和解释我们的混沌实验Kiosk Mesh的设计目标是易于使用 易于集成无论是我们是刚刚进入这个领域也好还是说我们已经在这边用了经过很久的磨练师 经验丰富的镇压也好我觉得我们都可以快速上手充分地使用Kiosk Mesh带来的能力然后我们简单介绍一下Kiosk Mesh的架构目前Kiosk Mesh它设计主要是有四部分构成首先我们有Kiosk Dashboard这是我们可能最常见的用户最常见的部分它是一个web UI它就可以用来管理以及检查我们混沌实验的情况它提供了一个图印画的界面然后用户可以在上面非常轻松地创建 运行以及监控我们的混沌核酸状态然后我们拥有一个Kiosk Controller Manager这个是我们最核心的这是我们最核心的组件它负责管理和调度混沌实验它会检测和处理我们混沌实验中的状态变化就是遵循了Curventis Operator的模型来确保混沌实验是按照预期进行的接下来我们有Kiosk DemonKiosk Demon是Kiosk Mesh的混沌的注入器和执行器它其实是最直接和Linux的控制者打交道它会在每个节点上有一个Privilege的Demon Set然后负责执行Ctrl Manager发送的命令来包括注入和恢复实验还有一个就是我们刚才提到的Kiosk DKiosk D因为它是物理机上面的注入器所以没有划在Curventis的Degro图里面Kiosk D它是一个独立的一个组件它可以运行在物理机上然后用来模拟对物理机和迅速机的一个混沌注入这些部分其实就沟通了Kiosk Mesh的构价然后可以是用户在Curventis的环境中或者是非Curventis的环境中注入我们的实验再简单介绍一下Kiosk Mesh它的工作流程Kiosk MeshCtrl是我们的关键组件之一当我们通过压某方式或者是在WebUI里面创建一个混沌实验以后Kiosk Mesh ControllerKiosk Controller Manager它会观测到这个实验的创建或者更改然后Kiosk Controller Manager会决定合适根据你的Spec决定合适进行故障注入和恢复然后以及你的预期到底是什么比如说到底是网络故障还是说泡的故障一旦决定将要进行故障注入的时候Kiosk Controller Manager就会调用Kiosk Demon来执行故障注入然后我们来聊一下Kiosk DemonKiosk Demon是Kiosk MeshCtrl另一个关键组件它负责最实际的故障注入和恢复操作Kiosk Demon其实是使用LinuxContainer的一些相关的技术比如说Name Space和C Groups我们来侵入我们需要被注入的容器可以精确地控制和限制容器的一些资源应用或者占用它的资源或者在里面加入一些Network的规则来达到模擬各种故障的目的所以说通过容器这种形式Kiosk Mesh可以在容器级别进行故障注入而且它的隔离性也是相对比较好的可以接下来我们来展示一下Kiosk Mesh的一些Practice实践哈啰 大家好我先简单介绍一下Kiosk Mesh在PinCab以及Tedby以及Tedby Cloud这样的一个实践就是像大家可能知道Tedby是一个封布式数据库然后它底层有一个存储的组件叫Tedby也是CNCF的一个项目所以像这种存储的组件它经常会和一些内核打交道比较多所以在最早的时候我们再去Build这样一个数据库的时候我们遇到过这样的一个问题这个问题就是说我们是把Tedby集群部署到K8环境里面但是我们官次到K8环境里面我们的Tedby 它的Io出现了斗动但这种斗动我们一开始又找不到原因所以我们就开始去排查这个斗动的问题然后我们通过它的一个Io的一个系统调用并且在斗动的时候我们发现Demessage里面出现了这样一个没办法分配内存的这样一个错误然后我们当时就去查这个错误到底是什么原因出发的最后我们找到是因为KMemory里面一个Accounting就是在内核比较早的版本里面它有一个内核的Bug但是这个内核的Bug呢需要你开启一个叫一个Limit的一个式子然后它就会触发这个问题然后我们后来发现是因为K8里面的RomC然后它默认把这个这个式子打开了然后触发了这个问题其实你要把内核版本伸上去之后其实就没有这个问题或者是K8里面把这个Page默认Page关掉了也没这个问题但是我们当时在使用的时候都遇到了这样一个问题所以遇到这样的问题也就给我们带来一个警示就是说内核问题它并不是说内核非常稳定其实它内核问题经常发生只是有时候我们各种组建底层的一些东西把它给覆盖掉了或者是屏蔽掉了所以但是当我们做一些底层的服务的时候这些内核问题就是我们需要去考虑的所以基于质点我们就想有没有什么方式可以帮我们去快速或者帮我们去覆盖掉这些问题所以我们就去开发了Calsmatch以及内部的一个次数平台这也是我们当初为什么去做Calsmatch的一个原因对这地方我们开发Calsmatch之后我们想把整一个混沌工程这样一个事情融合到整一个TeddyB的一个开发流程里面也就是说当我们研发在开发的时候在测试的时候在发版的时候都应该用到这一个混沌工程去帮助他们去验证他整一个系统开发的新的Feature但是这些混沌工程的一些Case可能是说我们之前线上遇到的问题也可能是说我们设计我们开发提到的一些设计好的一些Case融合到我们这样的内部的一个开发平台里面然后把这些Case就是我们用GateHubReple不同分支来去管理不同版本的一个运行的一个Case然后底层去调用Case Match然后来当我们有新的版本去处发的时候我们就会去处发这样的一个稳定性次事这个次事正常会跑七成二小时七成二四小时当遇到问题了之后我们再去迭代回归我们这样一个次事这是我们整一个TeddyB在发布的时候要跑的这样一个次事就正常来说我们Master版本会跑所有的我们积累下来的一些Case不同其他分支的版本有一些特定的Case有一些特定feature的Case都会加进去用过这种GateHub再加Case Match这种结合的方式然后以及我们内部有一个Case管理的这样一个可说话的一个管理的一个平台的方式来去帮助我们的一个次事以及研发在开发次事发版的过程中去使用这样一个Case Match以及使用这个混沌工程刚才提到就是说因为我们TeddyB然后现在也提供TeddyB Cloud这样的一个原服务有客户想要上你的一个原服务的时候他首先想的是你的原服务或者是你的TeddyB到底稳不稳定我们如何来去帮助用户来去确定他们整一个系统或者说这么说让他们来相信我们系统是稳定的我们就想能不能把我们之前在内部做的一些故障测试这些东西全部落成一个个的一个Case然后在我们的Cloud上当用户想去做PoC的时候他一键点把所有的稳定次事全跑一遍然后给他一个稳定次事的一个报告这样的话用户就会他在上线的时候PoC的时候都会更加相信这个平台的稳定性所以我们在后面在做TeddyB Cloud的时候我们也就尝试把我们的一个故障测试这样注入以及互动工程的能力融合到我们的云平台上去这地方其实是简单的一个我们云平台的一个架构其实三层的一个逻辑很简单因为底层是一个我们运行集群的里面就是K8的一个集群然后上层是Globo然后再加Reyno的一个管控我们通过这种在用户的一个K8里面当用户要开始就是要做这样的一个测试的时候我们通过上层的一个叫叫Cals Service然后把这样的一个安装的命令发送到Reyno上的一个控制面然后Reyno上的控制面然后再用户的一个K8集群里面去安装这样一个Cals Match其实整体的链路是非常简单的其实这条链路和大多数做Cloud或者做集成管理都是比较类似的对所以就是说我们当用户要去做的时候我们用户需要先去安装就是它有一个按钮去enable这样的一个功能然后再去把它的一个故障按钮我们把一些Case定义好它去跑这样的Case然后再出这样的一个报告对OK这是一个我们在Teddy B Cloud上去做简单招Test的一个例子也就是说这边是一个按钮就是说我们需要用户先去开启这样的一个功能然后enable这样的功能功能之后它在选择要去测试的一些Case就比如说我要去模拟PD 挂掉或者是Meta数据挂掉或者是模拟某一个节点有问题或者是网络分区这些我们把这些Case都是落地好它一键去出发就可以了这样的话用户就不需要再去自己去设计这样的一个实验并且能够去我们能够按照我们的理解去帮设计好这种一个流程帮它出完整的一个文音测试报告对然后但是因为你做这种招Test测试或者是文音测试的时候它其实是有迫害性的所以你在做这个测试的时候我们在这个流程里面加了一个审聘流程也就是说你创建了这个实验之后需要有其他的人去Apple就是去允许去运行这个实验然后才可以去运行大多数的时候我们用户在PoC的时候会这样去用这样的一个招Test测试对然后当用户去相当于就是Apple之后然后就会去做这样的测试最后去输出这样一个完整的一个测试报告对OK我的介绍到这些我接下来交给向林OK下面我给大家介绍一下我们那个腾讯专委员在混沌工程领域的一个最佳实验然后这个奥斯卡是我们腾讯专委员的一个混沌工程的平台也是我们腾讯这边的最佳实验的一个载体这个奥斯卡就是我们腾讯专委员的一个自言的混沌平台然后在构建平台底层能力故障的时候我们是用了Calc Match做底层的一个能力的注入然后奥斯卡平台是提供了一个丰富的固状注入类型然后具有强大的固状编排的场景然后方便用户在自己的开发和生产环境中然后去模拟出现的各种现实中可能出现的异常对,然后去帮助用户去发现系统的潜在问题然后目前的话奥斯卡是在内外部都有的非常多的一个使用OK好,那么我们下面就来看一下整个奥斯卡平台的架构以及Calc Match在这个奥斯卡平台里面的一个位置那么我们整个平台最上层的就是流量入口用户通过HTTP或者是UI的话对整个平台进行访问APS Server会接受来自于流量入口的所有的请求然后做相当的处理那么编排引擎的话会对注入的故障进行一个整体的编排并且去做一个执行然后故障的具体的编排的信息任务执行的一些详细的中间的一些信息都会存在持久化的一个存储中Calc Match则位于混沌注入层它和自言的混沌注入能力一起为整个平台提供了整个原子故障注入的一个能力最下面的话就是说我们平台是长在K8S底额上面的然后还有一些可以选择腾讯的一些私有营的一些服务然后这张图的最左边其实也是我们的一个最佳实践就是Oscar Hub它主要用于储存和分发我们编排好的各种故障场景那么我们下面就来看一下Calc Match在Oscar中的一些最佳的实践的案例这个Case的背景就是说我们专委员具有局点多并且内置产品多然后客户对内置产品的高可用的演练都有一些需求在这个情况下那么我们怎么样去解决这些问题那么我们就设计并实现了这个叫做Oscar HubOscar Hub可以把编排好的混沌场景进行存储和分发我们就可以在不同的提交的这个局点做演练就一遍达到一个一次编排多局点演练的一个效果那么我们在选择故障编排的时候不去选具体的编排类型不是不去选具体的编排的这个目标对例如说我不会去具体的选我要连连跑的A跑的B我去选择这个对应的产品的它的一个label这样的话我们就可以动态的去在故障注入的时候去选择具体的一个注入的这个对象从而保证去实现一次编排多局点演练的这样一个效果OK第二个case第一次则是我们的一个演练的管理和演练报告输出的这个部分其实我们在演练这件事情的话一般是可以分为就是演练前演练中演练后三个部分对吧那我就分别就这三个部分来给大家分享一下我们在这块的一个经验那么首先是演练前如果大家就是平时做过混沌工程实验的话可能会遇到一些这样的场景就是我可能写错了一个注入的容器或者说我注入的泡的它可能已经在系统里面不存在了这样的话你去触发实验就会报一个错然后这个错的话你可能要排查半天然后最后发现是自己写错了或者说是你自己要演练的资源已经不在了那么这就会导致我们花很多的时间去浪费在这一个可以说是不值得的事情上面去吧我们为了快捷地解决这个问题然后我们这边就引入了叫做演练目标的一个检查能力也就是说我们在演练之前会对演练的目标的状态做一个检查只有演练目标的状态符合我们预期我们才会去做演练这样的话就导致了前面我说的这样的一个问题那么在演练中的话我这边是非常建议大家将注入故障的一些细节还有恢复故障的一些细节都持久化的落到你的持久村主的盘里面去这样的话我们后续去复盘还有去归党的时候是非常有用的然后在演练后的话奥斯卡平台是会输出一个报告就是最右边的那个然后这个报告的话里面有详细的一些演练场景然后详细的演练信息还有一些监控信息之类的这样就可以帮助我们做一个演练的这个归党然后包括后续我们如果是针对这个演练我们要做一些复盘什么的都可以非常方便的从这些报告里面去得到我们想用的信息OK好 谢谢陈文和向宁在下一个节奏我们来看下一个章节我们看一下Calsmash未来的发展方向大家其实可能看到了就是无论是在腾讯的使用还是在平台的使用都发现Calsmash并不是一个all-in-one的这么一个平台它有擅长的东西也有不擅长的东西随时我们想做的事件即使说发挥我们所擅长的东西然后Calsmash作为一个目前来说它是一个比较强大的后能工程注入工具我们会在注入过来这边做经然后也会去尝试探索其他的更多就是后能工程中整个币环中更多的一些领域我们最多来说目前最高来说是关于avazorability的一个事情就是关于可观测性因为我们在发现如果一个系统它的可观测性可观测性没有做好那么我们人在上面做后能工程是非常不靠谱的而且我们一些关于故障Cals experiments自己的metrics其实我们目前也暴露的比较少所以我们目前在做的事情其实是在Work for the House 里面在Work for the House 里面加入和House Check 相关的一些集成可以使用户按需确保自己应用的健康检查然后以确保后能工程的实验是符合预期稳定运行或者是根据当前的情况按需终止然后再又是我们希望提供一些Cals experiment 相关的一些metrics比如说如果我们注入了一个网络的一个故障我们其实挺希望说这个链路中具体的流量情况是怎样然后丢包丢垃圾等等等等然后我们现在我们还正在计划支持多集群的Cals它的目的是能够使用户只操作一个集群相当于是在management cluster 中就可以在多个集群中统一的调度和管理互动实验也就是说我们可以在一个集群转建了一个workflow然后这个workflow可能会它是一个多集群的实验比如说我们可能在同时不同的集群里面注入podcast or network chaos然后我们的代码库其实在持续不断的优化中我们会根据最新的可能性支持一般我们发release以后到后面的一到两周内我们会就会把最新的codebase支持进去然后我们也在持续不停的优化集成测试以及端道端测试因为Cals这个场景它可能没有办法做太多的单元测试来集成因为它和太多模块的集成了比如说一个network chaos我们如果不引用集成测试的话我们是很难确保它确保它是达到我们的它是很难确保达到我们的目的和效果的然后最后我们其实也在探索是不是有和其他客人项目合作的机会比如说我们现在在流量方面可能有HTO有linker D然后在github上面已经有hatexon或者是flex我们其实有一种想法就是说有没有一种可能性使用纯的开源组件来拼凑一个叫做chap这样一个系统chap它其实是netflix内部的一个新闻叫做cals automation platform它其实就可以指导从流量自动的分流挥度然后一直到最后的可担心报告以及最后的结构它其实都是可以自动化的执行我们其实在想我们有没有机会使用开源的项目来组建这么一个平台cals mesh未来还是可能性非常大的我们非常期待与大家一起探索这个领域然后我们今天下午还有机会还有机会参与加我们的boost我们今天下午在12点半到下午2点在p3a这个地方我们在1楼那个会厅你可以与我们同学直接交流无论是技术细节还是时间也好都可以来聊然后欢迎欢迎加入我们的社区然后你可以访问这个cals meshcals mesh.org可以访问我们的文档我们里面有非常详细的使用指南以及上述文档然后如果您在使用中遇到任何问题可以在slack或者是说get a hub issue或discussion里面提ticket然后我们也有twitter和youtube channel社交媒体然后我们也会发一些我们最新的一些活动消息或者说ticket story好cals mesh的社区cals mesh的发展是离不开社区的支持非常期待你们能够加入我们和我们一起互动好我看我们还有时间大家有什么问题可以想问的吗喂您好您说 请说这样的就是没有声音的时候因为是这样的就是你下面的cognitis的集群它可能是源于自建的可能源于训计可能源于其他的运动商我们当天在社区里提过一个问题就是我们在GTB进行故障注入的时候当它可以产生问题就是可以产生GTB的一些故障可以达到一些的效果但是它会分不了它是它会什么不了它就是我看一下具体的稍等也就是说您是你在使用cals mesh注入GTBcals的时候遇到了一些问题对吗是的就是比如说你注完之后泡的就不能再访问了这个可能是我们可以我们一会儿在我们boost上面讨论一下这有可能是一个kiss by kiss的一个情况或者bug我们可以细节聊一下我知道它的回复原因应该是这样的就是因为它涉及到一些内核的东西因为云厂商或者说一些其他的购用商它对网卡网络网络的插件和Linux的内核有拆解所以都会分不了是的这个其实也是一个我们目前遇到比较棘的一个问题就是我们对各个云厂上面的支持我们其实现在还没有做到就是完全的那个compatibility测试这个可能是需要社区和我们一起去做这个事情我没有办法保证它在所有的云厂还有所有的操作系统所有的发行板上都完美执行这个可能是需要我们一起去共同构建这个事情这个有什么具体的计划吗这个暂时没有在文党上有突出计划我们可以后面聊因为目前我们没有那么多好还有其他同学有问题那边我方便把话筒传过去谢谢你好你好我之前其实也是用过然后就是我有一个问题比如说刚刚讲Oscar他们那个平台的时候演练的时候有加入一些比如说容错范围容错范围检查因为比如说我演练的时候我有一些错误我是预期到预期到我是可以接受的有这些容错范围检查的这种OK就是你的问题是Oscar在演练的时候是否有这个自动终止的一些条件对吧就是例如例如我的这个我的这个平台已经可能这个故障已经影响到生产了对吧或者说可能我的流量已经在往下走了这边就是Oscar在这个解决这个问题的时候是有一个能力这个能力就是通过HTEP或者是爱我脚本去调用你的一个特定的接口它可能是你的业务接口也可能是其他接口如果他举个例子如果你这个接口返回了4次以上的非200的这个请求那我们就可以自动化的一个演练的case自动终止掉这样去保证我们的混沌演练不会对你的生产平台造成故障性的影响OK其实其实这个也是我下一个想问的问题但是我刚刚有问题的重点就是说比如说我打个比方我有两个POD那我有一个POD我通过混沌工程就把它干掉了那我的业务实际上可能无论是再怎么样很牛的负载均衡它总会有那么一点的就是抖动的对那我这个抖动其实是在我的容作范围以内的那比如说我整个这个整个这个实验演练的这个过程那我判断它成功或者失败就是这个抖动有这种就是可接受的这种检测这个是有的就是这边的话就是在OS卡里面我们提供了一些策略化的配置你可以容忍它抖动它抖动一段时间假如说可能两秒或者三秒如果超过了这个范围那我们就认为你这个演练的结果是不符合预期的如果你这个抖动可能只有一秒钟那我们就是会其实在演练报告里面我们是有一个这可能看不太清楚啊就是其实这个地方是有一个结论的就是会有一个演练结论在就是如果如果我们的那个检测系统检练到这个地方的话看不清这个地方会显示就是说你的这个演练是符合这个整个预期的对它会有一个这样的一个检测的机制在不好意思由于实验关系可能我们没有更多的时间来回答下面的问题但是还是欢迎参加我们的这个BOOST然后有更多的谢谢可以在下面聊非常感谢大家今天能过来听我们在这边聊CALCEMENT好 谢谢