关于系统:稳定性关于缩短MTTR的探索-京东物流技术团队

一、什么是 MTTR ?当零碎呈现系统故障时,咱们须要通过一些指标来掂量故障的重大水平和影响范畴。其中MTTR(Mean Time To Repair 名为_均匀修复工夫_)是一个十分重要的指标,它能够帮忙咱们理解修复零碎所需的均匀工夫。破费太长时间来修复零碎是不可取的,尤其对于京东这样的企业来说更是如此。如果MTTR过长,可能会导致用户结算卡单、影响公司支出损失等严重后果。因而,为了确保零碎的稳定性和可靠性,咱们须要尽可能地缩短MTTR。 要计算MTTR,就是将总保护工夫除以给定时间段内保护操作的总数,MTTR计算公式: 二、如何缩短MTTR理解MTTR对于任何组织来说都是一个十分重要的工具,因为它能够帮忙咱们更好地响应和修复生产中的问题。在大多数状况下,组织都心愿通过外部保护团队来升高MTTR,这须要必要的资源、工具以及软件反对。 那么,您能够采取哪些步骤来缩短组织的MTTR呢?最好的终点是理解MTTR的每个阶段并采取措施缩小每个阶段的工夫。具体来说,咱们能够思考以下几个方面: 1、问题发现工夫:监控报警辨认故障对于产生故障后技术人员辨认问题的时间段,咱们能够通过建设报警零碎来缩短MTTR辨认工夫。通过实时监测零碎的运行状况,及时发现并触发报警机制,能够帮忙咱们在最短的工夫内定位问题,并采取相应的措施进行修复。 咱们能够通过设置正当的阈值和规定,过滤掉那些不必要的告警信息,从而防止告警乐音对开发运维团队的烦扰,让他们更加专一于真正的问题。 1.1、UMP监控通过UMP实现3个黄金监控指标(可用率、调用量、TP99)。在配置报警机制时,咱们能够综合思考可用率、TP99以及调用量等因素来进行评估。通过这些指标的综合评估,能够帮忙咱们更全面地理解零碎运行状况,从而及时发现潜在的问题并采取相应的措施。 倡议在进行报警配置时,可先采取较为严格的策略,即先紧后松,逐渐调整到最佳状态。这样能够确保在最开始阶段就可能及时发现问题,避免出现重大故障。但随着零碎的逐步稳固,咱们也能够依据理论状况适当放宽报警阈值,以进步零碎的可用性和效率。 须要留神的是,在进行报警配置时,咱们须要联合具体的业务场景和零碎特点来进行调整和优化。不同的零碎可能存在不同的危险点和瓶颈,因而咱们须要依据理论状况来制订相应的报警策略,以保证系统的稳定性和可靠性。 critical告警形式:咚咚、邮件、即时消息(京ME)、语音可用率:(分钟级)可用率 < 99.9% 间断 3 次超过阈值则报警,且在 3 分钟内报一次警。性能:(分钟级)TP99 >= 200.0ms 间断 3 次超过阈值则报警,且在 3 分钟内只报一次警。调用次数:当办法调用次数在 1 分钟的总和,间断 3 次大于 5000000 则报警,且在 3分钟内只报一次警warning告警形式:咚咚、邮件、即时消息可用率:(分钟级)可用率 < 99.95% 间断 3 次超过阈值则报警,且在 30 分钟内报一次警。性能:(分钟级)TP99 >= 100.ms 间断 3 次超过阈值则报警,且在 30 分钟内只报一次警。调用次数:当办法调用次数在 1 分钟的总和,间断 3 次大于 2000000 则报警,且在 3 分钟内只报一次警如果UMP是定时工作,最重要的一点就是确定好监控时段。只有正确地配置了监控时段,能力确保UMP在预计时间段内失常执行,这样一旦UMP未能在预计时间段内执行,就会主动触发报警机制,及时发现并解决问题。1.2、报警要 快、准、少在解决报警信息时,咱们的要害不在于数量的多少,而在于信息的准确性和完整性。咱们的小组每天都会接管到几百个报警信息,你是否有足够的精力和工夫去查看每一个呢?你能确保每一个都失去了关注吗? 因而,咱们须要对业务影响进行评估,并依据状况设定适当的报警频率。特地是对于那些被视为"要害语音"的报警信息,咱们更应该第一工夫发现并进行解决。只有这样,咱们能力保障在面对紧急情况时,可能迅速、精确地作出反应,最大水平地缩小可能的影响。 1.3、细节决定成败如果报警信息的响应工夫较长,咱们须要检查一下团队的值班响应机制是否失常。咱们须要确保告警信息是否可能无效地传播给正确的人,以便及时解决问题。对于报警信息的日清日结,咱们应该建设相应的解决机制,确保每条报警信息都能失去妥善处理。如果无奈做到日清日结,咱们须要深入分析起因,并采取相应的措施加以改进。在解决报警信息时,咱们须要深入分析其根本原因。只有找到问题的本源,能力从根本上解决问题。如果报警频繁但始终未被解决,咱们须要认真思考这个报警是否有必要的存在。有时候,一些报警可能是因为误报或者无关紧要的问题引起的,这时候咱们须要对这些报警进行筛选和排除。如果呈现问题后发现对应的UMP或其余环节的报警信息未增加,咱们须要仔细检查是否还有其余外围环节也漏增加了。如果有漏增加的状况,咱们能够采纳工具扫描来发现。对于之前呈现的报警信息,咱们不能凭教训认为是某起因导致的。历史教训并不一定精确牢靠,只有通过考察和剖析相干日志能力得出真正的论断。在配置报警信息时,咱们须要认真思考其合理性。倡议先采取紧后松的形式逐渐调整到最佳状态。这样能够防止一开始就呈现过多或过少的报警信息,从而进步工作效率和准确性。2、缓解零碎问题工夫:故障响应机制、疾速止血为什么咱们须要缓解零碎问题工夫,而不是仅仅定位问题呢?这是因为在解决零碎问题时,仅仅定位问题只是解决问题的一部分。更重要的是,咱们须要尽快缓解零碎问题,以防止其对业务的影响进一步扩充。 为了进步问题解决效率,咱们须要从以下三个方面动手: 欠缺指挥体系和角色分工:一个欠缺的指挥体系和明确的角色分工能够无效地进步故障解决的效率。在解决问题时,各个角色须要明确本人的职责和工作,并协同配合,独特解决问题。齐备的技术层面故障隔离伎俩:在技术层面上,咱们须要采取一些故障隔离伎俩,比方通过DUCC开关等形式来防止适度回滚代码。这样能够更加疾速止血(DUCC开关秒级,如机器多回滚须要5-10分钟)通过足够的演练的故障解决机制保障:最初,咱们须要建设一个通过足够演练的故障解决机制保障,包含UAT环境测试、捣鬼演练、应急预案SOP等。这样能够在真正呈现问题时,疾速响应并无效解决问题。总之,为了进步问题解决效率,咱们须要采取一系列措施来缓解零碎问题工夫,而不仅仅是定位问题。只有这样,能力真正保障系统的稳定性和可靠性。 2.1、执行故障应急响应机制无论一个组织规模有多大,其最重要的特色之一就是应答紧急事件的能力。在面对紧急情况时,须要有一套欠缺的应急预案和实战训练机制,以确保可能疾速、无效地应答各种突发状况。为了实现这一指标,咱们须要从以下几个方面动手: 建设齐备的训练和演习流程:建设和保护一套齐备的训练和演习流程是十分重要的。这须要一批对业务相熟、专一投入的人来负责制订和执行相干打算。同时,还须要依据理论状况定期进行演习和模仿测试,以确保应急预案的有效性和可操作性。先把问题上报组内、施展团队的力量:在解决紧急事件时,应该先把问题上报组内,并充分发挥团队的力量。通过集思广益的形式,能够更加疾速地找到问题的本源,并采取相应的措施进行解决。正当断定问题重大水平:在判断问题的重大水平时,须要具备良好的工程师判断力,并放弃肯定的沉着。总之,为了进步组织的应答紧急事件的能力,咱们须要建设齐备的训练和演习流程,充分发挥团队的力量,并正当断定问题的重大水平。只有这样,能力真正保障组织的稳定性和可靠性。 要害角色分工 ...

September 27, 2023 · 1 min · jiezi

关于系统:直播系统源码平台内容安全与版权维护技术DRM

在数字化的时代,人们的生存中已深刻到网络中来,许多人退出了直播零碎源码平台中来,直播零碎源码平台为用户们提供了一个公布图文短视频、开启直播、获取最新资讯的中央,这也衍生出了许多网红、主播等用户,他们会在直播零碎源码平台公布高质量、受泛滥粉丝青睐的短视频与直播,当然,直播零碎源码平台只有是非法用户都能够公布短视频、开直播。随着直播零碎源码平台的疾速倒退,越来越多优质的内容被出现进去,这也让许多不法分子动了歪心,开始进行盗播、盗录等违法行为,这激发了泛滥用户的版权意识,许多用户联结起来进行保护本人的内容平安与版权,然而内容平安与版权保护只靠用户的致力远远不够,还须要直播零碎源码平台的开发人员的致力,这时候,DRM技术也被开发进去,爱护内容平安与保护版权。 DRM技术的定义:DRM技术又称为数字版权治理技术,是一种爱护数字内容的工具。DRM技术在直播零碎源码平台中的机制就是首先确定用户是否为非法受许可用户,之后确保非法受许可的用户可能拜访、复制和应用这些数字内容,限度那些不非法未经许可用户的散发与盗录、盗播行为。 DRM技术在直播零碎源码平台的作用:1. 内容加密爱护:DRM技术有着将直播零碎源码平台中数字内容进行加密进行爱护的能力,并且能够对用户进行验证,如果用户未非法受权用户,DRM技术就能够为这些用户进行解密,让非法受权用户可能拜访应用这些数字内容;如果用户为未受权用户,DRM技术则不会为这些用户提供服务。2. 防录制和盗播:采纳DRM技术能够无效避免非法录制和盗播直播零碎源码平台的内容,并且加密后的内容只能在受权的平台和设施上进行解密和播放,不容易被非法获取和流传。3. 数字水印技术:DRM技术能够嵌入数字水印到直播零碎源码平台用户公布的内容中,以便追踪和查究非法传播者的责任。数字水印是一种不可见的标记,能够蕴含辨认信息,通过数字水印能够追踪源头和确认非法流传的行为。4. 访问控制:在直播零碎源码平台的用户直播中,DRM技术能够通过访问控制权限,限度只有受权的用户能力观看直播内容。用户想要观看直播内容就须要进行身份认证和受权,能力获取解密密钥和拜访权,从而爱护直播内容的安全性。 DRM技术在直播零碎源码平台的后端搭建参考代码:bogokj-bugukjconst express = require('express');const app = express();const bodyParser = require('body-parser');const drmService = require('your-drm-service'); app.use(bodyParser.json());app.post('/start-live-stream', (req, res) => { const streamUrl = generateLiveStreamUrl(); res.json({ streamUrl });});app.post('/get-drm-license', async (req, res) => { try { const contentId = req.body.contentId; const drmLicense = await drmService.generateLicense(contentId); res.json({ drmLicense }); } catch (error) { console.error('DRM许可生成失败:', error); res.status(500).json({ error: 'DRM许可生成失败' }); }});const port = process.env.PORT || 3000;app.listen(port, () => { console.log(`服务器运行在端口 ${port}`);});论断:在现在,人们的版权意识的逐步加强,直播零碎源码平台须要数字版权治理DRM技术,DRM技术的呈现让用户不用放心本人公布内容的平安,也让那些想要去盗播、盗录等不法行为的用户被阻挡。DRM技术曾经成为爱护知识产权和保护内容平安的无力工具,为内容创作者、权力持有人和直播平台自身提供了保障,使观众可能享受高质量、非法的直播内容。

September 11, 2023 · 1 min · jiezi

关于系统:谈一谈文件系统的多租户实践

多租户是云服务的重要属性。通过集群级别调度云服务实例,亦或是机器级别调度来自不同云服务实例的申请,云服务既要保障整个集群的物理资源都失去高效的利用,同时也要保障每个租户都能达到预期的性能指标。 1.多租户与QoS的必要性云作为一种通用资源,为各行各业提供了弱小的计算与存储能力,防止了用户自建基础设施、自行保护各类服务等所带来的开销。云服务通过负载平衡、隔离及QoS等技术,以及无限的物理资源服务了海量的用户。同时,从单个用户的视角看来,其性能与独占物理资源时的相比,没有显著的差别。 残缺内容请点击下方链接查看: https://developer.aliyun.com/article/1257051?utm_content=g_10... 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

July 10, 2023 · 1 min · jiezi

关于系统:主动发现系统稳定性缺陷混沌工程-京东云技术团队

这是一篇较为具体的混沌工程调研报告,蕴含了背景,现状,京东混沌工程实际,心愿帮忙大家更好的理解到混沌工程技术,通过混沌工程试验,更好的为零碎保驾护航。一、概述1.1 钻研背景Netflix公司最早系统化地提出了混沌工程的概念。2008年8月,Netflix公司因为数据库产生故障,导致了三天工夫的停机,使得DVD在线租赁业务中断,造成了微小的经济损失。于是Netflix公司开始尝试利用混沌工程优化稳定性保障体系。2010年,Netflix公司开发了混沌工程程序Chaos Monkey,于2012年在Simain Army我的项目中开源,该程序的次要性能是随机终止在生产环境中运行的虚拟机实例和容器,模拟系统基础设施受到毁坏的场景,从而测验零碎服务的健壮性。2019年,阿里巴巴开源了ChaosBlade混沌工程程序,该程序能够联合阿里云进行混沌工程试验。2020年,PingCap 作为国内优良的数据库畛域开源公司,开源了其公司外部的混沌工程实际平台ChaosMesh。 基于以上开源我的项目,混沌工程项目在国内受到了多家公司的关注,越来越多的公司开始引入混沌工程进行零碎稳定性保障工作,通过混沌工程被动注入故障的形式,防止软件系统带来的未知危机。图1.1展现了软件系统稳定性危机与对策倒退工夫线的对应关系,能够发现,随着软件系统规模的扩充,零碎复杂度的增长及开发周期缩短,陆续暴发了屡次软件危机,同时,每次的软件危机都促成了软件系统稳定性保障措施的不断完善。而当下的软件系统的规模,复杂度和开发麻利水平再次迈入了一个新的阶段,导致系统的稳定性面临着新的挑战。此时,被动发现零碎稳定性缺点的混沌工程应运而生,再次补救了当下零碎稳定性保障形式的短板。 []() 图1.1 软件系统稳定性危机和对策倒退工夫线图 [起源:中国信息通信研究院] 1.2 钻研目标塔勒布已经在《反软弱》一书中论述了“零碎如何在不确定性中获益”的思维,混沌工程基于这一平凡思维,提倡应用一系列试验来实在地验证零碎在各类故障场景下的体现,通过频繁地进行大量试验,使得零碎自身的反脆弱性继续加强。每一次故障中的获益,让零碎一直进化,造成正向循环,逐步提高零碎的品质,保证系统的健壮性。因而,混沌工程钻研的首要目标就是被动发现零碎的稳定性缺点。表1-1列举了近几年比较严重的几个零碎稳定性故障事件,从侧面反映了零碎稳定性保障的重要性。 表1-1 零碎稳定性故障事件 公司名称产生工夫继续时长影响范畴故障起因哔哩哔哩2021年7月约1小时影响了视频播放、直播等多个外围服务机房故障,灾备零碎生效滴滴2021年2月约1小时滴滴打车APP零碎外部谬误谷歌2020年12月约1小时谷歌旗下多个业务存储超出限额亚马逊2020年11月约5小时局部服务器无法访问不当的运维操作触发了系统漏洞微软2020年9月约5小时Microsoft Office 36办公软件和Azure云产品流量激增导致服务中断当混沌工程成为常态化的零碎稳定性的保障伎俩后,零碎的整体稳定性将失去进一步晋升。通过混沌工程平台,被动向零碎注入故障,验证和评估零碎抵制故障并放弃失常运行的能力,提前辨认未知的缺点并进行修复,保障系统更好得抵挡生产环境中的失控条件,无效晋升零碎的整体稳定性。 1.3 钻研意义混沌工程的次要钻研意义在于进步零碎的稳定性,通过被动向零碎中注入故障的形式,钻研和进步零碎的健壮性,在肯定水平上补救了零碎产生故障时被动响应的短板,升高了零碎应答故障的危险和老本。表1-2列举了应用混沌工程前后的零碎稳定性保障形式的比照,能够发现,应用混沌工程后,零碎稳定性的保障形式更加杰出。 表1-2 应用混沌工程前后的零碎稳定性保障形式比照 比照内容应用混沌工程前应用混沌工程后发现缺点的形式线上缺点产生时才开始辨认被动注入故障发现零碎缺点应答缺点的形式被动响应,缺点应答的开始工夫取决于故障何时产生被动响应,缺点应答的开始工夫取决于混沌工程的试验工夫辨认缺点的效率较低,对于触发条件刻薄的潜在缺点可能须要很长时间较高,通过被动注入故障,使得潜在缺点尽快裸露响应缺点的老本可控性较差可控性良好另外,实际混沌工程对不同职位的工作人员也有着各自的意义。如表1-3所示,混沌工程有助于帮忙零碎相干人员发现潜在的软弱点,升高零碎稳定性缺点可能造成的损失。同时,通过混沌工程注入故障,能够无效锤炼团队发现和定位问题并疾速复原零碎的能力。 表1-3 实际混沌工程对不同职位的意义 职位实际混沌工程的意义软件开发工程师进一步加深对系统的了解,验证零碎架构的容错能力测试开发工程师补救传统测试方法留下的空白,更被动的形式发现零碎的问题运维开发工程师进步系统故障的应急效率,实现故障告警、定位、复原的有效应对产品经理理解产品在突发状况下的体现,晋升客户在突发状况下的产品应用体验1.4 钻研办法[]() 图1.2 混沌工程实际体系和软件开发个别流程分割图 [起源:中国信息通信研究院] 依据调研的混沌工程实践经验,混沌工程的研发办法能够概括为图1.2中的混沌工程实际体系。其中,混沌工程实际配套是混沌工程成功实践的要害,因而要求实际团队做好混沌工程实际的战略规划,造就混沌工程实际相干人员,造成混沌工程文化,辨认应答潜在的危险并对混沌工程实际做出无效的评估。在此基础上,混沌工程试验是混沌工程钻研的外围工作,即混沌工程以试验为最小单元钻研发现零碎的稳定性缺点,试验的个别流程是:实验设计、试验施行和后果剖析。具体内容个别包含:试验需要和对象、试验可行性评估、观测指标设计、试验场景环境设计、试验工具平台框架抉择、试验打算和沟通、试验执行及指标收集、环境清理与复原、试验后果剖析、问题追踪、自动化继续进行验证。当通过混沌工程发现了零碎稳定性缺点时,须要依据理论状况给出对应的解决方案,如果存在架构的缺点,则需针对性得采纳韧性设计对稳定性缺点进行改良,其余如边界条件和极其状况未思考或者编码谬误的缺点,若占比拟高且重复呈现,则须要评估是否须要在制度标准上对软件开发过程进行更好的管控。 对于更加具体理的论和混沌工程的个别试验步骤,能够从该书《混沌工程:Netflix零碎稳定性之道》中获取到,电子版书籍见本报告附录。该书对混沌工程进行了十分具体的论述,图1.3为该书的目录构造。 []() 图1.3 《混沌工程:Netflix零碎稳定性之道》目录 二、钻研现状2.1 业界混沌工程工具目前业界应用的混沌工程工具的品种很多,表2-1汇总了本次调研中发现的业内放弃保护更新的几个工具,不同工具侧重于不同品种的故障注入。 表2-1 混沌工程工具汇总 工具名称最新版本外围语言蕴含场景特定依赖ChaosBlade1.7.0Go试验框架,支持系统资源、网络、利用层面等多种故障的注入无特定依赖ChaosMesh2.3.1Go试验框架,支持系统资源、网络、利用层面等多种故障的注入依赖于K8s集群ChaosToolkit1.12.0Python试验框架,可集成多个IaaS或PaaS平 台,可应用多个故障注入工具定制场景, 可与多个监控平台单干观测和记录指标信息通过插件模式反对多个IaaS、PaaS,包含 AWS/Azure/Goog le/K8sorchestrator3.2.6Go纯MySQL集群故障场景无特定依赖powerfulseal3.3.0Python终止 K8s、Pods,终止容器,终止虚拟机反对 OpenStack/AWS/ 本地机器toxiproxy2.5.0Go网络代理故障,网络故障无特定依赖2.2 业界混沌工程实际平台业内的混沌工程平台个别由:用户界面、任务调度模块、故障注入、监控告警零碎四个局部组成。 用户界面: 为试验平台提供混沌工程试验工作的编排和配置服务,使得用户方便管理各类混沌工程试验工作。当混沌工程试验开始后,用户能够通过工作进度条、服务器指标等展现图实时的查看试验进度和零碎指标状况。当混沌工程试验完结后,用户能够看到最初的混沌工程实验报告。 任务调度模块: 该模块负责用户界面和故障注入之间的交互,外围性能是实现混沌工程工作的批量下发和调度。 故障注入: 故障注入负责接管任务调度模块下发的故障注入工作,实现相应的故障注入事件,并反馈故障注入工作的执行状态。 监控告警零碎: 该零碎负责记录和管理系统产生的所有数据,生成告警和相干统计并反馈给用户。 2.3 混沌工程实际能力评估混沌工程实际能力的评估能够帮忙团队更好地理解混沌工程实际的情况,表2-2列举了混沌工程试验成熟度的等级,该等级能够用来评估以后零碎进行混沌工程实际的能力,次要反映执行混沌工程实际的可行性、有效性和安全性,等级越高则阐明可实际混沌工程的能力越强。 表2-2 混沌工程试验成熟度等级 []() 三、京东混沌工程实际泰山混沌工程平台是基于业界成熟解决方案ChaosBlade并联合京东业务特色设计并落地实现的一款自助式故障演练平台。用户可依据本身服务特点有针对性的场景编排、故障注入,对服务容灾能力进行评估,通过试验探索的形式建设对系统行为从新的认知了解。推动建设混沌文化,通过被动摸索的形式发现零碎中潜在的、能够导致劫难的、让咱们的客户受损的软弱环节,毁灭它们,让咱们的零碎更加强壮有韧性。 图3.1展现了泰山混沌工程演练的流程图,基于泰山混沌平台,红方的工作是: (1)创立演练打算:通过拜访泰山平台,进入门路:平安生产-混沌工程页面,页面提供“创立演练打算”按钮,点击即可进入演练配置页面。 (2)演练配置:点击创立演练打算按钮后,进入演练配置页面,可录入演练根本信息及工作配置项(演练配置-利用相干(类型、形式、场景)、演练配置-执行相干),图3.1中红色字体为本次演练重点配置项。 (3)执行演练:演练工作创立保留后,生成一条待执行的演练工作,手工点击执行按钮执行演练。 蓝方的工作是: (1)故障排查:在演练执行中,蓝方通过报警信息,先下掉报警机器,进行排查。 (2)复原计划:演练中发现问题要及时复原,演练后要重启复原演练机器,确保机器失常运行 试验实现后须要进行演练复盘,即对演练中发现问题总结及剖析,确保不再呈现相似危险问题。 ...

June 8, 2023 · 1 min · jiezi

关于系统:从反脆弱角度说一说技术系统高可用性策略

1 非线性咱们先来介绍一个概念:非线性。这个概念在咱们的生存中无处不在。 你要赶早上8点钟的火车,如果6:30登程能够在7:00达到车站,于是你失去一个论断:只有30分钟就能够达到车站。 你早上想睡晚一点预计7:10登程,想着7:40能够达到车站。然而最可能的后果是你将错过这趟火车。因为正好遇上早顶峰,堵车导致你至多须要破费1个小时能力达到车站。 一个小雪球的分量是100克,打雪仗时你被砸中100次,这对你不会造成任何影响。 然而如果你被10公斤的雪球砸中1次,这可能会对你造成重大的挫伤。 这就是非线性。事物不是简略的叠加关系,当达到某个临界值时,会造成一种齐全截然不同的后果。 2 秒杀零碎咱们来剖析一个互联网的秒杀场景。假如你设计的秒杀零碎当每秒30集体拜访时,响应工夫是10毫秒。即从用户点击按钮至失去后果这个过程,只破费了10毫秒。这个工夫的流逝基本上觉察不到,性能是不错的。你感觉很好,持续设计: 每秒30个访问量,响应工夫10毫秒每秒300个访问量,响应工夫100毫秒每秒3000个访问量,响应工夫1000毫秒如果你依照这个思路去做零碎设计,将会产生重大的谬误。因为当每秒3000个访问量产生时,零碎的响应工夫可能不是1000毫秒,而可能间接导致系统解体,无奈再解决任何的申请。最常见的场景就是当缓存零碎生效时,导致的零碎雪崩: 当耗时低的缓存层呈现故障时,流量间接打在了耗时高的数据库层,用户的期待时长就会减少期待时长的减少导致用户更加频繁去拜访,更多的流量会打在数据库层这导致用户的期待时长进一步减少,再次导致更频繁拜访当访问量达到一个极限值时,造成零碎解体,无奈再解决任何申请流量和响应工夫绝不是简略的叠加关系,当达到某个临界值时,零碎将间接解体。3 黑天鹅与三体欧洲人素来都认为只有白天鹅,因为他们素来只看到过红色的天鹅。 他们的这种想法有多动摇,那他们在澳大利亚发现彩色天鹅时,震撼就有如许大。 这就是驰名的黑天鹅事件的由来。黑天鹅事件指事先无奈预知,一旦产生将具备微小影响的不确定事件。 咱们来剖析一下欧洲人的白天鹅实践。他们采纳的是归纳推理的办法,这也是科学实验中罕用的一种办法。 当他们没有见到黑天鹅之前,认为只存在红色天鹅是成立的。但当黑天鹅呈现时,整个认知霎时分崩离析。 一个更加值得关注的零碎是混沌零碎。这个零碎最大的特点是,当一个渺小的扰动产生时,会给整个零碎带来微小的影响。典型混沌零碎的体现就是蝴蝶效应和三体问题。 一只蝴蝶挥动翅膀能够带来一场飓风。 三个天体在互相的万有引力作用下,静止轨迹无奈预测,这也是刘慈欣《三体》三部曲的根底设定。 处于混沌零碎,不晓得黑天鹅事件将在什么工夫,什么中央,以什么模式产生。 咱们不晓得7点钟登程会被堵多久,不晓得秒杀零碎在开抢的霎时会有多大的访问量,不晓得某大V在微博上颁布的音讯会带来多少激增的流量。 4 工程零碎稳定性咱们来思考一个问题:怎么保障一个工程零碎的稳定性?有以下两种做法: 思路1:思考到所有意外状况,针对每一个意外的异常情况别离解决思路2:承受无奈预料到所有意外状况的事实,把兜底计划做好,保障即便呈现极其状况,零碎也不会解体咱们仔细分析思路1会发现这其实是一个悖论。 所谓意外状况就是意料之外的状况,无奈意料的状况。如果被思考到了,那么也就不能称之为意外状况了。 塔勒布在经典著作《反软弱》始终想通知咱们:黑天鹅事件是无奈预测的,极其意外状况是无奈预测的,尾部危险尽管概率小,但破坏力却极大。 咱们无奈预测会产生什么故障,以及什么时候产生。但面对不确定性,咱们不会束手就擒,至多能够把零碎爱护好。 5 高可用策略为了保证系统的稳定性和高可用性,咱们须要采取一些策略。我认为高可用外围策略个别蕴含:冗余+主动故障转移策略,降级策略,延时策略,隔离策略。高可用理论利用计划多种多样,但个别都在施行上述策略,从而构建一个稳固的高可用工程零碎。 5.1 冗余 + 主动故障转移策略最根本的冗余策略就是主从模式。原理是筹备两台机器,部署了同一份代码,在性能层面是雷同的,都能够对外提供雷同的服务。 一台机器启动提供服务,这就是主服务器。另一台机器启动在一旁待命,不提供服务,随时监听主服务器的状态,这就是从服务器。当发现主服务器呈现故障时,从服务器立即替换主服务器,持续为用户提供服务。主动故障转移策略是指当主零碎产生异样时,应该能够主动探测到异样,并主动切换为备用系统。不应该只依附人工去切换成,否则故障解决工夫会显著减少。 5.2 降级策略所谓降级策略,就是当零碎遇到无奈接受的压力时,抉择临时敞开一些非关键的性能,或者延时提供一些性能,把此刻所有的资源都提供给当初最要害的服务。 在秒杀场景中,下订单就是最外围最要害的性能。 当零碎压力将要达到临界值时,能够临时先敞开一些非核心性能如查问性能。 当秒杀流动完结后,再将临时敞开的性能开启。这样既保证了秒杀流动的顺利进行,也爱护了零碎没有解体。 还有一种降级策略,当零碎依赖的上游服务呈现谬误,甚至曾经齐全不可用了,那么此时就不能再调用这个上游服务了,否则可能导致雪崩。所以间接返回兜底计划,把上游服务间接降级。 5.3 延时策略用户下订单胜利后就须要进行领取。 假如秒杀零碎下订单每秒访问量是3000,咱们来思考一个问题,有没有必要将每秒3000次访问量的压力传递给领取服务器? 答案是没有必要。 因为用户秒杀胜利后能够稍晚付款,比方能够跳转到一个领取页面,提醒用户只有在10分钟内领取实现即可。 这样每秒3000次的访问量就被摊派至几分钟,无效爱护了零碎。技术架构还能够应用音讯队列做一个缓冲,让领取服务依照本人的能力去解决业务。 5.4 隔离策略物理隔离:利用别离部署在不同物理机、不同机房,资源不会相互影响。 线程隔离:不同的申请进行分类,交给不同线程池解决,当一类申请呈现高耗时和异样,不影响另一类申请拜访。 6 无所不备则无所不寡《孙子兵法》虚实篇通知咱们一个情理:备前则后寡,备后则前寡,备左则右寡,备右则左寡,无所不备,则无所不寡。 力量集中在前,前面就充实。力量集中在后,后面就充实。力量集中在左,右面就充实。力量集中在右,右面就充实。如果力量扩散在前后左右,那么前后左右就都充实。 不确定性扩散在前后左右无奈预测。咱们不可能将精力扩散在前后左右,然而技术人员至多能够做好一点:爱护好零碎。

March 24, 2023 · 1 min · jiezi

关于系统:Sanitizers-系列之-leak-sanitizer-介绍

内存透露简介非法内存拜访谬误很快就会裸露进去,但不同的是,内存透露谬误有时即便长时间运行也不会裸露进去,这就导致内存透露谬误是不易被发现的。内存透露可能并不重大,甚至无奈通过失常形式检测到。在古代操作系统中,应用程序应用的内存在应用程序终止时由操作系统对立开释,这意味着只运行很短时间的程序中的内存透露可能不会被留神到并且很少是重大的。 然而内存透露带来的危害是不可漠视的,内存透露会导致系统可用内存逐渐缩小从而间接升高计算机的性能,极其状况下,当零碎的可用内存被耗尽,此时零碎全副或局部进行工作,零碎无奈启动新的应用程序,零碎可能因为抖动而大大减慢,这种状况通常只可能通过重启零碎才可能让零碎复原。 lsan 简介lsan 是一个运行时内存透露检测器,它能够与 asan 联合应用以同时取得检测内存拜访谬误和内存透露的能力,它也能够独自应用。lsan 是在过程完结时才开始透露检测,因而它简直不会升高程序的性能。 开启 lsanlsan 反对两种运行模式,这两种运行模式下,lsan 的开启形式不同。 和 asan 一起运行 通过运行时标识 detect_leaks 来开启,asan 反对如下两种形式来传递运行时标记: 环境变量 ASAN_OPTIONS:ASAN_OPTIONS=detect_leaks=1 函数 __asan_default_optionsconst char*__asan_default_options() { return "detect_leaks=1"; }残缺例子参见: https://github.com/dengking/s... lsan 在 x86_64 Linux 的 asan 版本中默认启用。 Stand-alone mode 对性能要求高的场景可能无奈承受因为 asan 而引入的性能损耗,此时能够只开启 lsan。 对于 cmake,办法如下: set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fsanitize=leak")set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=leak")set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fsanitize=leak")Run-time flags和 asan 一样,lsan 也反对通过 run-time flag 来对它的行为进行调整。 设置 flag 的两种形式lsan 反对如下两种形式来传递 run-time flags,工程师能够依据理论状况选取适合的形式。 LSAN_OPTIONSLSAN_OPTIONS 是环境变量,在不同的 OS 中,设置的形式不同。 __lsan_default_options 函数应用该函数来将 run-time flags 嵌入代码中,例子:  ...

November 1, 2022 · 3 min · jiezi

关于系统:在职京东架构师的亿级系统架构实践经历总结架构修炼之道

这份笔记是退职京东架构师结合实际的生产实践,别离对网关、平台凋谢、分布式、MQ、RPC、I/O、微服务、容错的内容做了具体介绍。 其中的内容不限于概念,而是会下沉到实际背地的感悟与总结。 比方笔记具体论述了网关零碎是如何“抗量”,又是如何容错的,以及在每次大促中的备战教训。其余内容也是如此,基于实际,源于实际,比方微服务的实战案例、MQ的各种性能场景、音讯推送的实际等讲的皆是实际之道。 笔记内容介绍:完整版获取一、网关之道意识API网关一个API的生命周期API网关的基石——泛化调用如何公布API到网关零碎管道技术一个传统网关零碎有几种”死"法Servlet3异步原理与实际全异步网关脱库与多级缓存热更新网关零碎的七种武器 二、凋谢之道意识 OAuth2开放平台如何设计一套SPI利用架构讲—讲越权从Facebook数据透露谈凋谢平安API治理API经济沙箱环境 三、分布式之道意识分布式分布式事务分布式锁分布式限流衡星性能的指标QPS、TPS等 四、MQ之道意识JMS带着思考了解MQ下的基本概念生产幂等详述MQ各种性能场悬数据异构的武器---MQ+canal对于MQ再问本人几个问题 五、音讯推送之道意识音讯推送构建长连贯推送零碎之HTTP实际构建音讯推送零碎之Netty实际.—台服务器能够”跑"多少个连贯一台服务器能够“跑"多少个线程弱网络环境发送APNs 六、RPC之道意识RPCRPC是如何实现通信的—次RPC调用工夫都去哪儿了异步RPC 七、I/O之道意识I/O解读I/O多路复用技术解读Tomcat中的NIO模型 八、微服务之道意识微服务微服务后如何做一次零碎梳理朝着微服务的方向去做一次数据库拆分 九、容错之道意识容错降级与限流线程池隔离疾速失败熔断Hystrix的应用大促备战都“备"什么

October 29, 2022 · 1 min · jiezi

关于系统:天翼云全场景业务无缝替换至国产原生操作系统CTyunOS

中国电信天翼云于2021年公布基于欧拉的自研操作系统CTyunOS。截至2022年8月,CTyunOS已实现天翼云私有云平台全业务适配,通过提供残缺的迁徙工具体系和工程能力,使天翼云全场景业务无缝替换到CTyunOS,累计上线3万套,无效撑持中国电信“云改数转”的策略落地。 CTyunOS的上线标记着运营商私有云首次实现全场景国产原生操作系统的适配,也标记着中国电信天翼云全面切换至欧拉技术路线的操作系统。 openEuler是数字基础设施开源操作系统,通过一套操作系统架构,反对支流计算架构100%笼罩,笼罩全场景利用场景。 CTyunOS操作系统基于openEuler 20.03 LTS版本自主研发,蕴含天翼云齐全自研的虚拟化加强组件和云平台组件,欠缺的编译工具链及开发环境等个性,具备高性能、高牢靠、强平安和易扩大的特点,充沛联合了开源社区的能力,是针对云计算场景进行了深度优化的定制加强版本。 以后,CTyunOS曾经适配天翼云IaaS层云平台计算节点、存储节点、网络节点、治理节点,PaaS层的云翼、云道、云桥平台,下层的ECX、数据库等业务,平台性能晋升10%以上。 天翼云架构图 天翼云CTyunOS提供了齐备的迁徙计划,包含成立迁徙保障组织、迁徙剖析、方案设计、移植适配、搬迁施行和测试上线六个阶段,同时借助x2openEuler迁徙评估和原地降级技术,实现了全场景业务的“简略、安稳、高效”的替换。  ▎通过x2openEuler迁徙评估技术,对软件、硬件、配置的兼容性状况给出全方位的剖析。具体包含OS迁徙前后,下层业务软件接口上的变动、依赖软件包版本的变动,操作系统配置参数的变动等,保障业务的平滑迁徙。 ▎通过x2openEuler的原地降级技术,一键式将存量CentOS降级到CTyunOS,降级前后下层业务无需重新部署,参数无需重新配置,大大降低了降级时长。同时整个降级过程能够间接应用原有服务器资源,无需额定筹备备用机,大大节俭了迁徙老本。原地降级技术将单节点的降级时长管制在2小时以内,最大水平的缩小降级对业务的影响。  截至目前,天翼云CTyunOS 已在私有云内蒙古节点、一城一池、IT上云等资源池实现了规模迁徙3万套,服务天翼云千行百业客户。 将来,中国电信天翼云也将持续携手欧拉,独特欠缺CTyunOS操作系统,晋升零碎的可靠性及可用性,一直推动CTyunOS版本的继续更新和欠缺。同时,单方携手增强科技翻新和要害核心技术攻关,共铸天翼云松软数字底座,助力行业客户的数字化转型,推动中国数字经济高质量倒退。 

September 20, 2022 · 1 min · jiezi

关于系统:CentOS时代即将结束-国产系统能否避免受限覆辙

往年1月31日,CentOS8进行更新。2024年6月30日,红帽对CentOS 7的反对也将终止。至此,CentOS的时代就宣告完结了。这意味着CentOS的安全性将无奈失去保障,泛滥依赖CentOS的中国企业不得不扭转“路线”,但是否会变更到国外零碎上却打上了问号。尤其是在美国近期出台“不容许将安全漏洞共享到中国”的新规定后,国内企业对应用国外零碎是存疑的。 CentOS停服对泛滥国产零碎影响微小CentOS 起源于 CAOS Linux 的构建,是一种基于 RPM 的 Linux 发行版,与其上游源 Red Hat Enterprise Linux (RHEL) 兼容,由 Gregory Kurtzer 于2002年启动。 凭借开源收费、稳固、硬件兼容性好等个性,CentOS深受中国乃至全世界厂商和开发者的青眼,利用范畴极为宽泛,泛滥企业和零碎均基于CentOS推出了发行版,其中包含GE、Riverbed、F5、Juniper和Fortinet,以及大部分国产操作系统。 因而,CentOS 的停更影响微小,甚至欧洲核子核心和费米实验室曾公布联合声明示意,CentOS的完结可能会对全世界的粒子物理界产生显著影响。 对国产操作系统而言,其依赖社区操作系统版本,大多是剪裁、批改、定制、欠缺等,很多企业甚至云厂商Host上的主机默认都是CentOS。CentOS 的停更将导致泛滥国产零碎扭转“路线”,甚至不少国产零碎会“匿影藏形”,对于企业的生产、研发等也将产生重大影响。 齐全自主可控的国产零碎成迫切需要CentOS停更后,国内企业或者国产零碎是否能够持续依存于其余国外零碎持续开发或者生存?答案是否定的。 CentOS的停服阐明国外零碎在短暂服务的稳定性上是存疑的,美国近期出台的新规也让国外零碎在安全性上大打折扣,种种迹象都表明,国内企业想要谋求倒退,须要的是齐全自主可控、具备继续服务能力的国产零碎。 国内企业和国产零碎研发者对此也早有认知,尤其是近年来,国产零碎的研发过程一直放慢,涌现出了多个优良国产零碎,受到国内开发者和国内企业的追捧,以天翼云操作系统CTyunOS为例,其在openEuler Summit 2021上正式公布,至2022年4月,仅几个月工夫,CTyunOS在全国已上线10000余套,笼罩多种业务场景,且业务运行稳固牢靠。 这一事件也反馈出,中国须要有本人的开源社区,通过丰盛生态反对、齐全开源、产业共建等,提供极简开发、极致体验的开发平台,来实现社区的有序治理,企业数量和开源贡献者的疾速减少,进而推动中国开源体系的建设,为国产零碎的研发奠定良好基础。 在此方面,我国也获得了疾速倒退,如CTyunOS所基于的欧拉开源社区,据介绍,欧拉开源社区已倒退了330家社区搭档,8403名社区开发者,无效推动了国产零碎的自主翻新研发。 国产零碎应具备哪些能力以取代国外零碎随同我国开源社区的倒退,国内零碎的开发有了稳固且可能激发更多创新力的根底,但想要撑持起国内企业的业务倒退,还需具备多种能力。以其中的代表CTyunOS来看,国产零碎应具备以下几种外围性能,能力满足国内企业的须要。 1、国产零碎应具备长久服务的能力和良好的安全性,这是企业应用零碎时的根本要求,也是国内企业将眼光从国外零碎转向国内零碎的最大起因。作为背靠欧拉开源社区及天翼云的国产零碎,CTyunOS在长久服务上有着人造劣势。在安全性上,CTyunOS也进行了重点加强,可能提供 IMA 完整性度量框架和 secGear 秘密计算框架,可判断运行环境是否平安可信;同时还能提供平安架构工具 security-tool,使平安设置更便捷、更自动化。 2、国产零碎应适配多种架构,反对多样性算力。国内企业在架构抉择上存在肯定差别,CTyunOS可能在短时间内实现多业务的笼罩,并受到宽泛认可,其中一个重要起因便是其具备良好的适应性。据介绍,CTyunOS可能适配同源异构多样性算力,反对 X86、ARM 等多种架构,并在鲲鹏、飞腾、兆芯、海光上适配优化。针对多核场景,从调度、锁、缩小 CPU 共享资源抵触等方面晋升 CPU 多核的并行度,实现工作减速。 3、在企业上云过程中,国产零碎应起到良好的助推作用。上云是以后国内企业数字化转型的重要一环,零碎在此方面需具备应有的能力。CTyunOS中,天翼云打造的计算治理组件,提供反对超大规模集群(10k+宿主机集群)的低提早、高性能云平台。定制化的鉴权组件GoStone我的项目,大幅晋升鉴权认证性能,在雷同资源耗费的状况下具备高达百倍的平安性能晋升。 4、国产零碎在性能方面也应依据国产企业的理论状况进行优化。CTyunOS便具备优化内核能力、加强虚拟化能力,可能进行良好的内存分级扩大,在多种场景下晋升了过程调度的性能,CPU、内存、IO、网络调度的性能当先业内标杆 CentOS 17%,大数据、Web、数据库场景当先 CentOS 15%-22%,并且升高了主机 CPU 和内存耗费,大幅晋升性能和虚拟机密度,还达到了晋升物理内存应用效率的成果。 看清差距,国产零碎、国内开源还需继续加强以后,国产零碎在政策、技术支持下正疾速倒退,但仍旧要看到国内外的差距。依据数据,近年来,操作系统细分市场不断扩大,但国产操作系统的市场份额始终没有超过5%。 这要求不管开源零碎也好,还是国产零碎也罢,在产品、市场等方面都有广大的倒退空间,也有多方面的工作须要增强。 海比研究院赵满满撰文指出,中国的开源社区和生态离不开政策反对,我国也正在逐步加大此方面的政策疏导。同时,夯实国内开源的根底建设还需做好以下工作:要施展开源基金会等业余组织牵头引领作用,欠缺开源治理机制和治理规定,推广开源理念,放慢建设开源代码托管平台等基础设施等。 国产零碎倒退方面,则须要加大研发,加大适配,加大生态,扩充市场,须要天翼云等团队和公司,积极响应国家全面推动科技翻新、自主可控的策略,致力于钻研国产化代替计划,并不断完善相干技术,防止宕机、服务中断、数据泄露等危险,扩充业务覆盖层,助力国内企业更换品质牢靠、具备继续服务能力的商业发行版操作系统。通过国产零碎的倒退,助推企业上云、企业的数字化转型,为数字经济、数字中国奉献一份力量。

September 20, 2022 · 1 min · jiezi

关于系统:综合系统清理优化工具MacCleaner-PRO

MacCleaner PRO是一款弱小的综合零碎清理优化工具,蕴含了App Cleaner & Uninstaller Pro、ClearDisk Mac、duplicate file remover pro等六款零碎清理优化工具。应用MacCleaner PRO能够轻松监控Mac的性能。菜单显示硬盘,内存,电池,CPU,网络速度甚至Dropbox空间的实时状态。如果呈现任何问题,您能够立刻解决问题。 综合零碎清理优化工具:MacCleaner PRO

August 13, 2022 · 1 min · jiezi

关于系统:深圳系统开发CRM客户关系管理系统功能详解

企业抉择CRM客户关系管理系统是一个互相认可的过程。CRM服务商须要晓得企业的需要,企业也想晓得CRM客户关系管理系统能提供什么性能。市场上会有很多CRM客户关系管理系统,提供的产品和服务也会不一样。那么CRM客户关系管理系统的罕用性能有哪些呢?接下来至佳科技就带你理解一下。CRM客户关系管理系统性能详解: 1、服务自动化:帮忙客服人员从反馈中开掘潜在的销售机会,发明更大的价值;缩小客户投诉,进步客户满意度,能够进步服务常识和管理水平,积攒成功经验,帮忙企业真正贯彻以客户为核心的经营理念。 2、操作面板:当代人日日夜夜的工作抗压强度很大,社会倒退的压力也很大。长时间与一个界面打交道容易造成视觉审美疲劳,于是各种嫩肤性能应运而生。现在,这样的需要也延长到了CRM客户关系管理系统。 3、数据挖掘:可测量的数据是治理团队的前提。数据挖掘性能使营销部门可能发展有针对性的工作,一直优化营销流动,显著进步投入和产出。 4、团队合作:CRM客户关系管理系统也能够促成团队单干。每当咱们谈到一个大客户,或者遇到一个难题,咱们都会想到和团队分享。 5、挪动利用:挪动应用程序当初曾经成为CRM客户关系管理系统的规范。借助挪动CRM客户关系管理系统,销售经理能够随时理解线索、商机、人脉的停顿状况,关上零碎随时制订工作打算。销售人员能够记录访问流动和治理时间表。 6、拓展集成化:一方面在选型时最重视每个产品的这个要求的程度,另一方面在此基础上考查CRM客户关系管理系统的扩大和集成。从始至终,组织中的CRM客户关系管理系统总是越来越多。当组织内信息管理的发展趋势达到肯定水平时,就须要对这类软件进行集成利用,这将磨难CRM客户关系管理系统的扩大和集成能力。 7、客户公海池:客户池(Customer pool)又称公海池,是指客户信息的公共池和共享池,用于企业外部资源的再利用和客户价值的转化与晋升。 8、对立客户信息管理:整合各个客户治理部门的客户信息,对立记录客户信息、合同信息等,制订营销打算,记录、分类和辨认潜在客户,评估各种营销流动的有效性。 9、扩充销售:通过CRM客户关系管理系统的应用,销售成功率和客户满意度一直进步,扩充销售成为必然趋势。 不同的企业对CRM客户关系管理系统性能有不同的认识。购买CRM客户关系管理系统时,请思考您独特的销售团队和销售流程。它简直包含了企业用来取得无效后果的所有重要性能。依据您的需要,您能够将CRM客户关系管理系统视为客户治理或进步销售业绩的工具,或者视为多项治理工作的助手。无论如何,一个正确的CRM客户关系管理系统对建设良好的客户关系,进步销售业绩,甚至抵挡竞争对手都有很大的帮忙。如果您对此还有任何疑难,请点击在线客服征询或者拨打至佳科技全国对立服务热线0755-22675310。

August 9, 2022 · 1 min · jiezi

关于系统:深圳开发系统企业利用CRM客户关系管理系统效果显著

随着市场需求的日益强烈,传统的企业智能管理系统曾经越来越无奈充当客户关系和客户模式的动静管理手段,CRM客户关系管理系统给企业的经营治理带来了微小的改革。与传统的管理机制相比,利用CRM客户关系管理系统的企业成果更加突出。在这里,深圳至佳科技就带你理解一下。施行CRM客户关系管理系统给企业带来的成果大吗? 1、进步客户称心水平 CRM客户关系管理系统为客户提供各种沟通渠道,同时保障各种沟通形式下数据的一致性和连贯性。利用这些数据,销售部门能够对客户的要求做出疾速、正确的反馈,让用户在对产品的购买称心时,认可并违心与企业放弃无效的沟通关系。 2、减少利润率 因为对客户的理解更多,业务人员能够无效地把握客户的趣味点,进行无效的销售,防止在价格上自觉让利以达到胜利交易,从而进步销售利润。 3、升高市场销售老本 因为对客户进行了专门的辨认和分类,并剖析了他们的特色。使营销和销售策略的制订和施行防止盲目性,节省时间和金钱。 4、战略规划剖析零碎主观 通过剖析预测性能,使市场定位更加精确,市场策略制订更加精确无效,使企业倒退更上一层楼。 5、能够进步业务效率 对于销售人员:CRM客户关系管理系统能够帮忙每个销售人员治理日常工作、业务和效率。对于管理者来说:能够看到每个销售人员的客户状况,能够晓得所有的预期,所有的历史。对于公司老板:能够通过CRM客户关系管理系统理解整个公司目前的经营情况,须要哪些资源补充和调整,随时随地查看数据。实现任何模式的远程管理和管制。 以上是企业应用CRM客户关系管理系统的成果介绍。一个好的CRM客户关系管理系统能够成为推动企业利润增长的利器。CRM客户关系管理系统提供了一个高质量的CRM解决方案应该具备的所有性能,并通过嵌入的工作流、提醒、揭示和告诉,使这些性能完满地协同工作。是古代企业实现精准营销、晋升销售业绩不可或缺的工具。如果企业有相干需要,能够征询深圳至佳科技。

August 1, 2022 · 1 min · jiezi

关于系统:苹果系统维护工具Monterey-Cache-Cleaner

Monterey Cache Cleaner是一款简略好用的苹果系统维护工具,能够通过调整 互联网和文件缓存设置,进步零碎性能,实现RAM磁盘,和清洁 各种缓存过期数据。 性能特色 颐养Monterey Cache Cleaner是一站式解决方案,可满足您的所有macOS X保护需要。英特尔或PPC,Tiger或Mojave,MCC领有使您的零碎放弃最佳运行状态的工具。MCC文档和MCC引擎通过提供常见保护工作的齐全自动化(包含Internet下载的病毒扫描)来保护零碎衰弱。MCC引擎甚至能够在软件装置后主动修复权限。应用MCC引擎,弱小的系统维护和防病毒性能能够齐全通明或与菜单栏一样近。优化Monterey Cache Cleaner能够通过调整Internet和文件缓存设置,实现ram磁盘以及革除各种缓存和过期数据来进步零碎性能。MCC蕴含有助于优化文件和内存的工具。MCC能够通过打消语言本地化文件和缩小通用二进制文件来复原节约的磁盘空间。自定义Monterey Cache Cleaner可让您管制macOS X体验。敞开Spotlight或仪表板,或关上“登录我的项目”文件夹。MCC能够调整许多macOS X性能以满足您的口味。所有这些都不会永久性地扭转或侵害您的零碎。灾祸布局Mojave Cache Cleaner容许您从Mojave下载创立可启动的安装程序USB驱动器,该驱动器将在任何反对的计算机上启动和装置Mojave。Mojave Cache Cleaner容许您创立可启动的紧急磁盘,其中包含零碎修复实用程序和MCC弱小的缓存清理性能。如果产生劫难,Mojave Cache Cleaner的弱小性能可在单用户模式下的命令提示符下应用。MCC的注册用户能够在闪存驱动器或iPod上装置便携版本。Mojave Cache Cleaner Portable可在任何反对的Mac上运行,是购买机器前测试硬盘,屏幕像素,电池,内存等的绝佳工具。杀毒软件Mojave Cache Cleaner有助于爱护您的零碎免受恶意软件的侵害。MCC为Mojave减少了三层额定的恶意软件爱护,并附带内置的弱小ClamAV防病毒软件.MCC能够动静扫描您的下载,为Mac和Windows威逼提供工业级病毒防护。 下载:https://www.macz.com/mac/2767...

July 22, 2022 · 1 min · jiezi

关于系统:如何快速开发一个简单实用的MES系统

当初越来越多的企业曾经开始利用mes零碎,所以对于MES软件系统开发工程师的需要有所回升,那么开发MES零碎须要把握哪些信息?mes零碎怎么开发?MES软件系统开发要点有哪些?如果真的想开发一个MES零碎,须要从业务和开发两个方面动手。上面就来理解下MES软件系统开发常识吧。 一、疾速开发MES零碎须要哪些常识储备? 想疾速开发一个实用的MES零碎,首先你须要从业务和开发两个方面动手。 1、业务 业务是什么?你能够简略地了解为业务就是你零碎最终实现的性能。首先你要想MES零碎是干什么的,解决了什么问题。开发一个MES零碎,第一步就是要晓得本人的零碎要实现哪些性能,晓得了这个后你能力持续往后走。 而晓得零碎要实现什么性能,也是整个MES系统实施过程中十分重要的环节。因为行业的特殊性,MES零碎在每个企业的业务都千差万别,没有一个对立的标准。如果你没有到过生产现场,不理解生产过程,倡议你最好能理论到一个工厂车间里去理解一下。看看现场的工作人员是如何工作的,如果你能到一个曾经施行了MES的企业去看一下他们的零碎运行流程那更是极好的,看过之后你就会对MES管控的几个方面有了清晰的了解。 如果你没接触过生产,这里简略给你介绍下MES的几个次要功能模块,你能够围绕这几个模块进行设计。 (1)、打算调度这里MES承接了ERP中的订单,开始染指生产。这个模块次要是管控订单的生产工夫、什么时候开始、什么时候完结,由哪个班组,哪个员工,甚至哪个工位来生产。具体到特定细节还会对订单合成到工序,工步,和现场的物料状况剖析,是否缺料,是否生产。 (2)、生产执行这一步是具体的生产操作过程,在这一步工人会装置整机,过程中咱们的零碎要记录工人装置了什么整机、整机的批次、序列号信息,记录产品谱系,不便追溯。这里整机序列号的采集个别是通过扫描来录入零碎,也就是会波及到其他人答复中的条码辨认。更细一点还会采集工人装置应用的工具型号,工具的参数如扭矩、角度等。 (3)、质量检验这里会记录工人在装置过程中的自检后果,以及工人实现后由质检人员做出的最终测验后果。如果测验不合格,会发动另外的解决流程。 (4)、设施这一步是与现场PLC或者设施的交互,如测验后果不合格,或者整机装置谬误,MES零碎会与自动化控制系统通信来管制生产线的启停。同时对关键设备的运行状态及工艺参数进行采集。 (5)、工艺工艺这一步其实是贯通始终的,在零碎开始之前就要把工艺理分明,包含产品的工艺路线、BOM构造、参数等信息,工艺信息是保证系统正确运行的根底。 (6)、物流对生产过程中波及到的物料信息监控,确保生产可能顺利进行。 2、如何开发? 开发工作相对来说会比拟容易一点,因为要做的性能确定当前,开发无非就是工夫长短的问题。因为对于MES零碎来说,技术根本没有难点。因为咱们的零碎是实现业务逻辑,也就是各种增删改查的工作。保障MES零碎与周边零碎的接口稳固就好了,如ERP、WMS等。对于开发,如果你会一门编程语言及数据库的操作((SQL,存储过程)根本就OK了,当初传统企业大多也在应用B/S架构了。目前应用最多的还是C#,Java,Oracle,SQL Server等编程语言和数据库。其中数据库方面会更重要一点,因为业务简单,波及到的表就会很多。所以能正当设计数据库表关系十分重要。除此之外,自己理解到还能够用低代码平台来疾速开发MES零碎,依据相干数据表明,用低代码平台开发零碎比传统写代码开发速度快10倍。 二、MES软件系统开发要点有哪些? 1、基本功能 从基本功能蕴含性上来讲,基本功能全面的MES系统软件需具备产品和工艺治理、打算调度生产治理、物料物流信息管理、生产制作品质治理、车间设施保护治理办法的5大根底管制模块,当然也应与此同时蕴含生产制作资源管理等管制模块。而应答智能制作的MES,还务必具备信息系统集成和设施端口管制模块,不然无奈实现车间外部各种信息内容互联互通,并撑持智能化车间需要的智能调度、优化、可视化等基本功能。 2、平台化 市面上的MES要害分成依据客户需要的新我的项目级、客制化产品,及其通用的平台化产品二种品种。新我的项目等级MES劣势是:个性化、适用性强、低成本、疾速交付,但产生的短处是:开发需要形容中会不足行业的普遍性规范,非常容易造成系统软件不合乎变化多端的业务需要及行业标准,如果企业倒退方向后有新的需要就需要投入许多的二次开发,这对软件体系结构的可靠性也是严厉的考验。 3、应用性平台化 MES产品规定开发人员们可能深入细致了解而且相熟各行业的理论生产制作工作流程,甚至于对要害工序的深入细致到的工艺也须要把握,而不是仅从软件开发的视角来设计MES。与此同时,开发人员们更要依据生产制作的理论需要将所有的工序工作流程关系整顿分明,并按照ISA95等规范搭建平台化MES产品,以利于与其它各种标准化的软件实现业务关联及信息共享。 4、数字化排产 许多企业在数字化都没实现的状况下就过高的规定上全自动排产,后果造成大幅度的人力资源投入、并引起利润被这些减少的老本吞噬。相同毫无数字化规定的纸质人工排产必然让企业离智能制作的发展趋势渐行渐远,最终齐全脱队,失去中国制作2025这一弯道超车的机会和利好政策。上述这些数字化主动排产的基本要素全部都是大家筛选一个适合的MES产品的依据。 5、可视化基本功能 随同着中国制作程度的飞速发展,以前许多国外的所谓先进制作技术在我国早已重大掉队了。例如传统的IT人员依据应用部门固化的需要去开发一个个水晶报表和看板的客制化形式,早已远远不能充沛满足当今中国制作疾速的个性化生产治理需要。再例如以前单调乏味的报表&看板的格局内容,早已难以充沛满足现今客户的规定和品位。好的MES产品可视化表现形式早已愈来愈丰盛:点状图、线状图、柱状图、饼状图、雷达图、甘特图、漏斗图、三维图等都并不是问题。根底规定:好看震撼、一看就懂、信息内容全面。 6、信息系统集成能力 (1)与信息系统的集成化:身为面向智能制作的MES系统软件,信息系统集成能力应是重要考量,这蕴含与SQL、ORCAL等数据库集成化,与PDM(连贯BOM、工艺)、ERP(连贯打算、物料)、WMS(连贯物流、运输)、仿真(连贯数据)等软件集成化,与IOS、Android挪动端集成化等。 (2)与数据类型的集成化:它是下面形容的那些信息内容集成化的技术实现形式办法,例如:XML、CSV、TXT、彼此约定的两头表、Webservice、凋谢的API端口等。 以上就是对于“如何疾速开发一个简略实用的MES零碎”答复的全部内容,心愿对大家有所帮忙,总的来说,MES零碎是一种通向老本、品质、响应、灵便综合均衡的路径,在当今强烈竞争的世界经济中,要占有“最有价值”的位置,必须使企业具备最好的品质、最佳的客户服务、最低的制作老本、疾速响应以及灵活性的特点。

July 21, 2022 · 1 min · jiezi

关于系统:系统困境与软件复杂度为什么我们的系统会如此复杂

作者:聂晓龙(率鸽) 读 A Philosophy of Software Design 有感,软件设计与架构复杂度,你是战术龙卷风吗?前言有一天,一个医生和一个土木工程师在一起争执“谁是世界上最古老的职业”。医生说:“上帝用亚当的肋骨造出了夏娃,这是历史上第一次外科手术,所以最古老的职业应该是医生”,土木工程师说:“在创世纪之前,上帝从混沌中发明了地狱与世间,这是更早之前的一次土木作业,所以最古老的职业应该是土木工程”。这时软件工程师拖着键盘走出来说,“那你认为,是谁发明了那片混沌?” 建筑师不会轻易给100层的高楼减少一个地下室,但咱们却常常在干这样的事,并且总有人会对你说,“这个需要很简略”。到土里埋个地雷,这的确不简单,但咱们往往面临的实在场景其实是:“在这片雷区里加一个雷”,而雷区里哪里有雷,任何人都不晓得 。 什么是复杂性咱们始终在说零碎很简单,那到底什么是复杂性?对于简单的定义有很多种,其中比拟有代表的是Thomas J. McCabe 在1976提出的感性派的复杂性度量,与John Ousterhout 传授提出的理性派的复杂性认知。 感性度量 复杂性并不是什么新概念,早在上世纪70年代,软件就曾经极其简单,开发与保护的老本都十分高。1976年McCabe&Associates公司开始对软件进行构造测试,并提出了McCabe Cyclomatic Complexity Metric,咱们也称之为McCabe圈复杂度。它通过多个维度来度量软件的复杂度,从而判断软件以后的开发/保护老本。 理性认知复杂度高的代码肯定不是好代码,但复杂度低的也不肯定就是好代码。John Ousterhout传授认为软件的复杂性绝对感性的剖析,可能更偏理性的认知。 Complexity is anything that makes software hard to understand or to modify\译:所谓复杂性,就是任何使得软件难于了解和批改的因素。 John Ousterhout 《A Philosophy of Software Design》50年后的明天,John Ousterhout传授在 A Philosophy of Software Design 书中提到了一个十分主观的见解,复杂性就是任何使得软件难于了解和批改的因素。 模糊性与依赖性是引起复杂性的2个次要因素,模糊性产生了最间接的复杂度,让咱们很难读懂代码真正想表白的含意,无奈读懂这些代码,也就意味着咱们更难去扭转它。而依赖性又导致了复杂性一直传递,一直外溢的复杂性最终导致系统的有限腐化,一旦代码变成意大利面条,简直不可能修复,老本将成指数倍增长。 复杂性的表现形式简单的零碎往往也有一些非常明显的特色,John传授将它形象为变更放大(Change amplification)、认知负荷(Cognitive load)与未知的未知(Unknown unknowns)这3类。当咱们的零碎呈现这3个特色,阐明咱们的零碎曾经开始逐步变得复杂了。 症状1-变更放大Change amplification: a seemingly simple change requires code modifications in many different places. 译:看似简略的变更须要在许多不同中央进行代码批改。 ...

June 17, 2022 · 3 min · jiezi

关于系统:天翼云为欧拉社区贡献首个C热补丁-加速推进联创技术落地应用

天翼云与欧拉社区发展关键技术联结翻新 热补丁实现主机解体在线修复天翼云与欧拉社区共研反对aarch64及x86平台libcareplus热补丁性能 近日,中国电信天翼云基础架构技术团队与openEuler社区单干共研了全面反对aarch64及x86平台的libcareplus热补丁性能,并为欧拉社区奉献首个C++热补丁,实现主机解体在线修复。这是天翼云与欧拉社区联结发展要害技术创新获得的又一成绩。 之前单方已胜利研发了基于Libcareplus工具的Qemu热补丁性能。据天翼云科技有限公司副总经理兼首席技术官广小明在往年4月欧拉大会上介绍,Qemu热补丁性能使主机分批串行降级转变为并行同步降级,撑持现网补丁施行周期由月缩减到周,极大缩短了补丁的施行周期。 目前,新研热补丁工具普适性已失去极大晋升,利用场景更宽泛。而作为落地利用之一,天翼云为欧拉社区奉献的首个C++热补丁实现了云主机不必重启修复bug的能力,保障客户业务不中断,真正做到“为航行中的飞机更换发动机”。 热补丁技术可能在不影响现网业务的状况下实现程序修复、实用于须要疾速响应的场景,堪称是短小精悍。其中libcareplus热补丁技术更是集万千钟爱于一身。 据理解,ibcareplus热补丁技术是基于上游社区libcare独立倒退的分支,由openEuler社区进行自主孵化,次要包含热补丁制作、补丁治理和补丁加/卸载等。相比于上游社区的libcare,libcareplus作为一个用户态过程热补丁框架,能够在不重启过程的状况下,反对对x86和aarch64架构中Linux零碎上运行的指标过程进行热补丁操作。同时,libcareplus全面反对openEuler Qemu组件,反对函数级过滤、增量补丁、以及补丁文件解析等。 此次天翼云联结欧拉社区打造的libcareplus热补丁性能,能够利用于CVE破绽修复,也可利用于不中断应用服务的紧急bug修复。 而且在单干研发过程中,天翼云基础架构技术团队还针对全局变量、部分动态变量等热补丁性能缺失的痛点进行深度研发。以前减少全局变量补丁会导致指标过程解体,只能采纳分配内存等形式躲避,经优化后加强了补丁代码的易批改和易维护性。这些性能胜利适配多个支流Qemu版本,大大提高了libcareplus热补丁工具的适用性,为大规模批量利用奠定了松软的根底。 同时在理论业务利用场景中,天翼云发现libcareplus在解决g++高版本生成的汇编文件时,在汇编文件比对和生成过程中,代码块构造划分异样,进而导致生成的汇编文件无奈被as汇编器正确解析。天翼云联结欧拉社区针对该场景进行优化翻新,基于欧拉社区libcareplus 扩大减少反对g++8个性,实现libcareplus反对C++软件热补丁制作及治理能力。 目前,该个性源码及单元测试用例已奉献到欧拉社区,并在欧拉社区虚拟化SIG组进行技术分享,相干个性已被欧拉社区收录至22.03 LTS发行版。 新研热补丁工具普适性加强,利用场景更加宽泛通过天翼云基础架构技术团队与openEuler社区独特优化后,libcareplus热补丁工具的利用场景失去了极大的扩大。1.为单函数批改制作单个补丁 2.为多个函数批改制作多个补丁 3.新增函数 4.新增全局变量 5.TLS变量 6.冷热块重排 减速联创技术落地 天翼云为欧拉社区奉献首个C++热补丁 对很多用户来说,最怕在业务办理过程中忽然中断、期待修机,但这种景象却不断产生。当欧拉零碎下的云主机呈现Qemu解体时,通常状况下该问题能够通过重启云主机冷补丁形式进行修复,但会带来客户业务呈现短暂的中断。 为了解决线上局部Qemu crash导致云主机重启问题,中国电信天翼云弹性存储技术团队深刻代码剖析,发现原生librbd存在重大的代码bug。为了保障客户云上业务间断不中断,提供更高的云存储可用性,中国电信天翼云弹性存储技术团队通过一直重复验证和试验,利用libcareplus C++热补丁技术,librbd热补丁代码在不进行换行、不新增接口的状况下,通过代码数据结构,计算变量在内存中的地址偏移的形式对代码进行修复,最终在内存中更新librbd补丁,实现不需重启虚拟机打librbd热补丁能力,即云主机不必重启也能修复bug的能力,既保障客户云上业务连续性又大大缩短运维工夫,真正做到了“为航行中的飞机更换发动机”。 目前,该项热补丁技术成为了欧拉社区第一个C++热补丁,已在南宁、昌吉、兰州等资源池正式上线,部署超过10万台云主机,笼罩金融、医疗、政企等泛滥行业客户。 将来,天翼云将与欧拉开源社区继续单干,发展更多联结翻新,包含在晋升云主机资源利用效率方面,发展虚拟机高低优先级混部、容器在线离线混部翻新;在可信云主机方面,发展秘密计算翻新;在DPU卸载上,发展分布式存储卸载、容器网络卸载翻新;在云原生全栈方面,发展平安容器、KubeEdge 边云协同翻新等。

June 14, 2022 · 1 min · jiezi

关于系统:Fuchsia-concepts

总结官网文档的Fuchsia的根底concept Fuchsia Conceptions1. componentcomponent Framework:反对component通信、library、建设等等的局部component manager: 启动零碎(零碎中最早启动/最晚敞开的component)同时启动别的必要的component,例如filesystem中介作用,调用capability routing等反对component与环境交互、反对扩大component manifest:针对特定component的一系列形容/配置文件component lifecycle:被component framework or component runner决定 Bind:A调用B的capability称为A binds to B eager binding:如果b是B的child切eager,A分割到B,那么也bind到breboot:component退出之后会重启(包含运行胜利退出)topology、identifier、realm都是之前在getstart外面提到过的Environment:让develpoer能够设定component realm的行为DriverFuchsia中,driver能够 bind to matching "parent" devices, and publish "children" of their own. This hierarchy extends as required: one driver might publish a child, only to have another driver consider that child their parent, with the second driver publishing its own children, and so on.driver启动步骤: system start 开启root,root申请bind driversystem在零碎中找适合的driver并绑定到root上driver运行,可能会创立新的root去申请新的driver 例如PIC driver发现有一个新的外围设备,就会创立一个新的parent node,而后这个新node会申请一个新的driver来绑定,每次发现一个新的外围设备都会反复一遍此步骤绑定之后,进行init driver,包含init interface等等$ dm dump[root] <root> pid=1509 [null] pid=1509 /boot/driver/builtin.so [zero] pid=1509 /boot/driver/builtin.so [misc] <misc> pid=1645 [console] pid=1645 /boot/driver/console.so [dmctl] pid=1645 /boot/driver/dmctl.so [ptmx] pid=1645 /boot/driver/pty.so [i8042-keyboard] pid=1645 /boot/driver/pc-ps2.so [hid-device-001] pid=1645 /boot/driver/hid.so [i8042-mouse] pid=1645 /boot/driver/pc-ps2.so [hid-device-002] pid=1645 /boot/driver/hid.so [sys] <sys> pid=1416 /boot/driver/bus-acpi.so [acpi] pid=1416 /boot/driver/bus-acpi.so [pci] pid=1416 /boot/driver/bus-acpi.so [00:00:00] pid=1416 /boot/driver/bus-pci.so [00:01:00] pid=1416 /boot/driver/bus-pci.so <00:01:00> pid=2015 /boot/driver/bus-pci.proxy.so [bochs_vbe] pid=2015 /boot/driver/bochs-vbe.so [framebuffer] pid=2015 /boot/driver/framebuffer.so [00:02:00] pid=1416 /boot/driver/bus-pci.so <00:02:00> pid=2052 /boot/driver/bus-pci.proxy.so [e1000] pid=4628 /boot/driver/e1000.so [ethernet] pid=2052 /boot/driver/ethernet.so [00:1f:00] pid=1416 /boot/driver/bus-pci.so [00:1f:02] pid=1416 /boot/driver/bus-pci.so <00:1f:02> pid=2156 /boot/driver/bus-pci.proxy.so [ahci] pid=2156 /boot/driver/ahci.so [00:1f:03] pid=1416 /boot/driver/bus-pci.so设施sys领有driver host,而后这时候加载了[acpi]设施和相应的driverbus-acpi.so ...

May 25, 2022 · 9 min · jiezi

关于系统:系统性能分析从入门到进阶

简介:本文以零碎为核心, 联合日常工作和用例, 由浅入深地介绍了性能剖析的一些办法和领会, 心愿对想理解零碎性能剖析的同学有所帮忙。 作者 | 勿非 本文以零碎为核心, 联合日常工作和用例, 由浅入深地介绍了性能剖析的一些办法和领会, 心愿对想理解零碎性能剖析的同学有所帮忙。 入门篇资源角度USE 产品跑在零碎的各种资源下面, 从系统资源的角度入门性能剖析是个不错的抉择, 咱们以业界出名大牛 Brendan Gregg 的 USE 办法开始, USE 特点就是简略无效适宜入门, 用 Brendan 的话形容 USE 的成果: I find it solves about 80% of server issues with 5% of the effort. USE 从系统资源的角度, 包含但不限于 CPU, 内存, 磁盘, 网络等, 关注以下3个方面: Utilization (U): as a percent over a time interval. eg, "one disk is running at 90% utilization". 大多数状况能够正当揣测利用率高可能会影响性能 Saturation (S): as a queue length. eg, "the CPUs have an average run queue length of four". 资源竞争的强烈水平 ...

April 26, 2022 · 13 min · jiezi

关于系统:合作创新携手共赢共筑坚实数字底座

4月15日,2022欧拉开发者大会在线上胜利举办,旨在推动openEuler在服务器、云计算、边缘计算和嵌入式四大场景的技术摸索和翻新。天翼云科技有限公司副总经理兼首席技术官广小明出席会议,发表主题演讲,与开发者们一起摸索新境,共谋数字产业新将来。 打造CTyunOS,构筑数字底座软硬件自主可控是国家数字经济倒退的基石和重要保障。随着数字经济占GDP比逐年晋升,中国电信为践行“云改数转”策略,提出了“成为要害核心技术自主掌控的科技型企业,进入国家科技翻新企业第一营垒”的倒退指标,将单干与翻新作为企业高质量倒退的外围要害,助力数字经济倒退。 操作系统作为最重要的根底软件,首先要实现自主可控。中国电信公布了基于欧拉开源社区版本推出的自研操作系统CTyunOS。该操作系统针对云计算场景进行了深度的优化,外围组件实现自主研发,反对多业务场景和多种国产化芯片异构对立调度,致力于打造齐全自主可控的操作系统。自公布以来,CTyunOS已在全国上线1万余套,笼罩多种业务场景,包含私有云、公有云和一城一池等,业务运行稳固牢靠。 继续联结翻新,共建开源生态数字经济继续高质量倒退离不开技术创新和生态欠缺,科技企业要培养翻新倒退新动能,创始数字单干新场面。中国电信与openEuler社区独特摸索关键技术联结翻新,共建开源生态。 天翼云携手欧拉社区聚焦内核、用户热补丁、OpenStack等业务需要深刻研发。虚拟化场景下,天翼云针对在扩充内存容量的同时升高内存老本,晋升内存超售比的业务痛点,与openEuler开源团队携手,在虚拟机外部业务拜访不频繁的场景中验证分级内存技术,尝试在放弃业务性能持平的前提下晋升虚拟机密度,最终实现redis场景性能进步约30%,内存老本降落约35%,大大晋升内存应用性价比。 此外,为缩短补丁施行周期,天翼云与openEuler开源团队单干研发了基于libcareplus工具的Qemu热补丁性能,使主机分批串行降级转变为并行同步降级,撑持现网补丁施行周期由月缩减到周,极大缩短了补丁施行周期,保障云场景业务不中断。天翼云秉持社区共建、共享、共治的理念,继续为openEuler开源社区做出奉献。CTyunOS紧跟openEuler社区节奏,每6个月公布一个正式版本;参加openEuler社区IG-OpenStack、SIG-Virt、SIG-DPU、SIG-CloudNative、SIG-Kernel5个SIG工作组;累计提交PR200余条。倒退须要翻新,翻新须要单干,单干能力共赢。将来,天翼云将持续与openEuler社区继续翻新单干,独特构筑松软的数字底座,打造可信天翼云,推动数字产业前行,助力数字经济倒退。

April 25, 2022 · 1 min · jiezi

关于系统:系统困境与软件复杂度为什么我们的系统会如此复杂

简介:读 A Philosophy of Software Design 有感,软件设计与架构复杂度,你是战术龙卷风吗? 作者 | 聂晓龙(率鸽)起源 | 阿里技术公众号 读 A Philosophy of Software Design 有感,软件设计与架构复杂度,你是战术龙卷风吗? 一 前言有一天,一个医生和一个土木工程师在一起争执“谁是世界上最古老的职业”。医生说:“上帝用亚当的肋骨造出了夏娃,这是历史上第一次外科手术,所以最古老的职业应该是医生”,土木工程师说:“在创世纪之前,上帝从混沌中发明了地狱与世间,这是更早之前的一次土木作业,所以最古老的职业应该是土木工程”。这时软件工程师拖着键盘走出来说,“那你认为,是谁发明了那片混沌?” 建筑师不会轻易给100层的高楼减少一个地下室,但咱们却常常在干这样的事,并且总有人会对你说,“这个需要很简略”。到土里埋个地雷,这的确不简单,但咱们往往面临的实在场景其实是:“在这片雷区里加一个雷”,而雷区里哪里有雷,任何人都不晓得 。 二 什么是复杂性咱们始终在说零碎很简单,那到底什么是复杂性?对于简单的定义有很多种,其中比拟有代表的是Thomas J. McCabe 在1976提出的感性派的复杂性度量,与John Ousterhout 传授提出的理性派的复杂性认知。 1 感性度量 复杂性并不是什么新概念,早在上世纪70年代,软件就曾经极其简单,开发与保护的老本都十分高。1976年McCabe&Associates公司开始对软件进行构造测试,并提出了McCabe Cyclomatic Complexity Metric,咱们也称之为McCabe圈复杂度。它通过多个维度来度量软件的复杂度,从而判断软件以后的开发/保护老本。 2 理性认知复杂度高的代码肯定不是好代码,但复杂度低的也不肯定就是好代码。John Ousterhout传授认为软件的复杂性绝对感性的剖析,可能更偏理性的认知。 Complexity is anything that makes software hard to understand or to modify-- John Ousterhout 《A Philosophy of Software Design》译:所谓复杂性,就是任何使得软件难于了解和批改的因素。 50年后的明天,John Ousterhout传授在 A Philosophy of Software Design 书中提到了一个十分主观的见解,复杂性就是任何使得软件难于了解和批改的因素。 模糊性与依赖性是引起复杂性的2个次要因素,模糊性产生了最间接的复杂度,让咱们很难读懂代码真正想表白的含意,无奈读懂这些代码,也就意味着咱们更难去扭转它。而依赖性又导致了复杂性一直传递,一直外溢的复杂性最终导致系统的有限腐化,一旦代码变成意大利面条,简直不可能修复,老本将成指数倍增长。 三 复杂性的表现形式简单的零碎往往也有一些非常明显的特色,John传授将它形象为变更放大(Change amplification)、认知负荷(Cognitive load)与未知的未知(Unknown unknowns)这3类。当咱们的零碎呈现这3个特色,阐明咱们的零碎曾经开始逐步变得复杂了。 ...

February 28, 2022 · 3 min · jiezi

关于系统:助力国内厂商对接LAZBOY-EDI系统

我的项目概览 如果你看过美剧《老妈们》,那么肯定对这个场景印象粗浅:两个好友难受的躺在沙发上大喊:“邦尼,我当初的生存棒极了!你看,我领有一个La-Z-Boy!” 这张表面淳朴却有着让人感叹的舒服坐感沙发,正是寰球性能沙发的首创者,始建于1927年的美国传奇品牌 La-Z-Boy。妇孺皆知的 La-Z-Boy 之所以深受消费者青睐,源于产品的高性能与舒适度,而高质量的优良产品离不开寰球原材料供应商的协同生产。 供给与生产的疾速协同须要贸易单方的独特配合,而建设EDI电子替换零碎则为单方商业档案的替换提供了安全可靠的文件传输通道。2017年 , 知行软件帮助中国厂商与 La-Z-Boy 建设的EDI直连对接,通过知行EDI电子数据交换零碎,中国厂商能够实时接管 La-Z-Boy 订单、打印装箱贴纸、安顿发货并在货物离岸前及时收回发货告诉。需要参数 如下为 La-Z-Boy 要求的EDI施行需要参数: EDI连贯 传输协定:SFTP 平安协定 报文转换/Mapping 报文规范:ANSI X12 业务报文计划概览 如下为La-Z-Boy与供应商EDI电子数据交换整体计划。性能实现 上面将介绍EDI电子数据交换过程中波及的连贯协定与文件格式规范。 SFTP(Secure File Transfer Protocol) La-Z-Boy 要求供应商通过SFTP平安文件传输协定将档案传输到其网关服务器。因为SFTP采纳SSH进行加密/解密认证,大大加强文件传输的安全性。 EDI零碎内置SFTP端口将实现与La-Z-Boy 网关服务器连贯,实时上传&下载商业档案。 X12报文格式转换 La-Z-Boy 与供应商传输 X12规范报文,EDI 零碎可进行数据格式转换,确保数据精确翻译。 EDI零碎也可通过两头数据库表/API与多种业务零碎进行A2A集成,达到数据信息流共享的目标。栈板贴纸 EDI零碎主动生成La-Z-Boy要求的栈板贴纸-Master Label。栈板贴纸业务数据: (1)发送方信息 Ship From Information (2)运达方信息 Ship To Information (3)供应商ID La-Z-Boy Supplier ID# (4)码头ID Dock ID (5)产品编号(条形码) Part# (6)发货数量 (条形码) QTY (7)订单号(条形码)P.O.# (8)运单号(条形码)SID (9)装箱号 (条形码)Pack List# (10)批次号 Rev.Level (11)纸箱数量/包装数量 ...

January 7, 2022 · 1 min · jiezi

关于系统:电脑正常做系统

下载零碎映像下载本人的污浊版,这里是我最洁净的版本了然而前提你有百度网盘吗?我本人租的24小时。根本6分钟下载完 下载PE我用的是洁净没捆绑的优启通而后把这两个放在 D盘或者E盘。因为C盘你等会要格式化 运行并制作PE把油漆桶 点exe运行就是这样,而后把本地模式的地位换成D或者EF点击 “装置” 就不必管了。速度超级快!等会实现本人手动重启就行肯定会有人问!是不是按F8 还是 F12啊?通知你!不须要 进入PE后重启进去之后选他 抉择后分区 傻瓜式点击格式化就没事了,如果你不释怀。关上我的电脑,C盘相对是空的 我方才说过放到D盘,他自动检测!而后右侧选C盘一键修复!功败垂成!自己除了下载。全程6分57秒 桌面现在干干净净!开机7秒

October 10, 2021 · 1 min · jiezi

关于系统:什么是虚拟机

虚拟机应用软件和计算机硬件来模仿一个物理设施中的其余计算机。 虚拟机模仿一个独自的操作系统(来宾)和一台与现有操作系统(主机)不同的计算机,例如,在 Windows 10 上运行 Unbuntu Linux。虚构计算机环境呈现在独自的窗口中,通常作为独立环境隔离。尽管如此,通常容许来宾和主机之间的交互用于文件传输等工作。 应用 VM 的日常起因 开发人员应用虚拟机软件在各种平台上创立和测试软件,而无需应用第二台设施。您能够应用 VM 环境拜访属于操作系统的一部分的应用程序,该操作系统与您计算机上安装的操作系统不同。例如,虚拟机使得 在Mac上玩Windows独有的游戏成为可能。 此外,虚拟机在试验方面提供了肯定水平的灵活性,这在您的主机操作系统上并不总是可行的。大多数 VM 软件容许您拍摄来宾操作系统的快照,如果呈现问题(例如恶意软件感化),您能够复原到该快照。 为什么企业可能会应用虚拟机 许多组织部署和保护多个虚拟机。公司不是始终运行多台计算机,而是应用托管在一小部分功能强大的服务器上的虚拟机,从而节俭物理空间、电力和维护费用。 这些虚拟机能够从单个治理界面进行管制,并且员工能够从他们的近程工作站拜访,这些工作站通常散布在多个地理位置。因为虚拟机实例的隔离性质,公司能够容许用户在他们的计算机上应用这种技术拜访他们的公司网络,以减少灵活性并节省成本。 虚拟机为管理员提供齐全管制以及实时监控性能和高级平安监督。通过单击鼠标或命令行输出,能够立刻管制、启动和进行每个 VM。 虚拟机的常见限度 尽管 VM 很有用,但须要理解一些显著的限度,以便您的性能预期符合实际。即便托管 VM 的设施蕴含弱小的硬件,虚构实例的运行速度也可能比它在其独立计算机上的运行速度慢。近年来,VM 内硬件反对的提高获得了长足的提高。尽管如此,这种限度永远不会齐全打消。 另一个限度是老本。除了与某些虚拟机软件相干的费用外,装置和运行操作系统可能须要许可证或其余身份验证办法。例如,运行 Windows 10 的来宾实例须要无效的许可证密钥,就像在理论 PC 上装置操作系统时一样。尽管在大多数状况下,虚构解决方案通常比购买额定的物理机更便宜,但如果您须要大规模部署,老本就会减少。 其余须要思考的潜在限度是不足对某些硬件组件的反对和可能的网络限度。只有您进行钻研并有切合实际的冀望,在您的家庭或商业环境中施行虚拟机可能会有所帮忙。 管理程序和其余虚拟机软件 基于应用程序的 VM 软件,通常称为虚拟机管理程序,具备针对集体和企业用处量身定制的各种形态和大小。管理程序容许运行不同操作系统的多个 VM 共享雷同的硬件资源。系统管理员能够应用管理程序同时监控和管理网络中的多个虚拟机。 或者你会用到这个Parallels Desktop 16 for mac(pd虚拟机) 装置了虚拟机应用程序后,须要在虚拟机上抉择并装置操作系统。能够像应用任何其余计算机一样应用您的虚拟机。

July 25, 2021 · 1 min · jiezi

关于系统:证券公司投资银行类投行工作底稿系统建设指引

2008年,中国证监会下发《对于建设上市公司重大资产重组独立财务顾问工作底稿科技管理系统的告诉》,这是首次以成文的模式要求工作底稿承受电子化管控。2020年2月28日,中国证券业协会公布《证券公司投资银行类业务工作底稿电子化管理系统建设指引》(以下简称《指引》),进一步标准底稿零碎的性能、工作底稿管理制度。《指引》公布,要求证券公司、投行强化内控体系,履行好资本市场“守门人”的职责。那么重点来了,券商投行该如何搭建工作底稿零碎?云盒子科技针对券商投行业务各类业务特点,以及工作底稿在收集、整顿、流转、审阅、归档过程中存在的问题和难点,为券商、投行量身打造了一套工作底稿管理系统。工作底稿零碎合乎《指引》要求,实现投行各类业务的底稿电子化我的项目全生命周期文档及流程治理,同时造成一个集成的、开放式的协同治理、信息集中平台,彻底消除信息孤岛,实现业务数据、财务信息、历史材料的共享,并对公司战略决策、业务经营起到无力撑持。 基本功能1、底稿实时存储与归档工作底稿零碎本地私有化部署,军工级加密存储,清晰树形架构为立项程序的每一个我的项目建设独立的工作底稿目录,手机和电脑随时随地同步工作底稿,避免因底稿文件上传不及时、不精确导致相干危险管制工作呈现较大误差。同时工作底稿零碎反对大目录批量上传、断点续传。2、底稿权限治理与审批在底稿零碎的权限和明码治理中,反对对用户设置12级拜访权限,以满足不同级别用户的拜访要求,并强制要求用户应用强明码。从电子工作底稿的上传、审核、复核、品质管制、内核、查看等工作都通过底稿零碎发展,反对增加审核意见、回复意见,实现投资银行我的项目外部报批、审签。3、底稿平安与日志审计工作底稿零碎在平安层面上,领有防病毒、敏感内容管控、类型限度、近程备份、内容防截屏防复制、密级治理、三员分立七大体系。对底稿文件的变更痕迹进行动静跟踪并造成日志记录,具体显示我的项目、文件名、操作人、操作工夫、操作内容等,另外智能AI引擎可追溯所有异样动作。 特色性能01、到职人员一键交接所有材料云盒子【一键交接】,能够将到职或调岗的人员账号下的所有我的项目材料,办公文档等教训资料交接给新人员,让新人员到岗后不仅能迅速接替并适应其岗位,还能通过各部门的共享材料,及时获取最新的法律法规、外部管制和行为规范等文件。02、多达100+种文件格式的平安浏览这意味着,所有文件无需下载即可疾速预览,包含组成底稿的文档、扫描件、图片,以及市场流动计划、产品设计图纸等,无需期待,也无需额定下载预览插件,即点开即预览,不受终端限度,你甚至能够在手机上间接预览project我的项目文件和PS文件。03、内外网文件隔离与平安替换工作底稿零碎提供光闸、防火墙、DMZ等多种网络隔离计划,独创平安隔离技术,无需更改用户现有的网络设备架构,保障内网敏感数据平安隔离在内,而内外网替换数据上传下载实现“可管、可控、可审”的网络间平安替换传输。工作底稿是证券公司履行保荐责任和发表业余意见的重要依据,是体现业余程度、业余能力和业余精力的名誉资本。云盒子帮忙券商投行、实现底稿电子化标准治理,晋升投行业务规范化程度和公信力,也为证券公司业务数字化转型提供清晰明确的方向。

June 24, 2021 · 1 min · jiezi

关于系统:腾讯安全月报丨零信任发展趋势论坛数博会科技大奖奔驰安全研究成果……

June 2, 2021 · 0 min · jiezi

关于系统:进程线程以及协程的区别

一、并发和并行1.1 并发在操作系统中,一个时间段内有几个程序都处于正在运行的状态,而且这几个程序都是在同一个处理机上运行,但任意一个时刻其实只有一个程序在处理机上运行。 在一个只有单核(单 CPU)的处理器的操作系统中,同一时刻只能有一个过程运行。 假如只有一个过程运行,为了执行多任务,须要将 CPU的工夫资源分为很多个工夫片,将每个工夫片分给一个线程,每个线程就能够执行不同的工作。 这样做的益处是,每个线程只占用一个工夫片,当一个工作阻塞,当耗尽了内核调配给它的一个工夫片后就会挂起,接着执行其余工作,后续再切换到阻塞的线程时也只能占用一个工夫片的工夫。 有些文章说,内核将工夫片分给过程,其实不算精确,因为线程才是程序理论运行时的单元,过程只是一个容器,起码蕴含一个线程。当多个程序运行时,内核外表上是会将工夫片调配给过程,但实际上是依据过程里的线程数调配工夫的。 1.2 并行当初的市面上曾经没有单核处理器了,最低端的处理器也是多核(多 CPU)。与单核同样,每个外围同一时刻也只能运行一个过程。 同样假如每个外围只有一个过程,如果每个过程上都只运行一个程序(只开一个线程),这些程序因为是运行在不同的外围上,占用的不是同一个 CPU 资源,所以能够在同一时刻运行,且互不烦扰,这就是并行。 1.3 二者的区别并发和并行的区别就在于同时二字。 尽管并发和并行都能运行多个程序,但区别就在于: 并发是多个程序交替运行,因为工夫片很短,用户并不会感觉到 工夫片的调配规范也是以可感知水平设计的,Linux 的工夫片范畴为 5ms ~ 800ms并行是多个程序同时运行二、过程、线程和协程在内存上的区别2.1 过程内存过程是零碎进行资源分配的最小单位,是操作系统构造的根底。 在过程中,运行的程序中会产生一个独立的内存体,这个内存体内有本人独立的内存空间,有本人的堆,下级挂靠的是操作系统。 操作系统会以过程为单位调配系统资源(CPU 工夫片、内存等资源)。 过程的内存占用在 32 位零碎中为 4G,64 位零碎能够达到 T 级。 2.2 线程内存线程是零碎可能运行运算调度的最小单位。 一条线程是过程中的一个繁多程序的控制流,一个过程中能够并发多个线程,每个线程在宏观上并行(宏观串行)执行不同的工作。 同一过程中的多条线程共享该过程中的全副系统资源,如虚拟地址空间、文件描述符等。但每一个线程都有各自的调用栈、独立的寄存器环境、线程本地存储。 2.3 协程内存协程,又被称为微线程,顾名思义,就是轻量级的线程。 在协程初始化创立的时候为其调配的栈为2kB(不同语言的协程的栈内存可能不同,同一语言的不同版本也可能不同,此处以 Go 1.4+ 的协程为例),而线程栈要比这个数字大得多,Linux零碎上能够通过ulimit -s命令来查看线程内存占用。 $ ulimit -s8192 Kb在高并发web服务器中,如果为每个申请创立一个协程去解决,100万并发只须要2G内存,如果应用线程,须要的内存高达数 T。 2.3.1 粗略计算内存占用上面应用应用 Go 代码简略计算一下协程的内存占用: package mainimport ( "time")func main() { for i := 0; i < 1000000; i++ { go func() { time.Sleep(5 * time.Second) }() } time.Sleep(10 * time.Second)}系统资源: ...

May 28, 2021 · 2 min · jiezi

关于系统:分布式系统的理论发展

分布式是一种将繁多的节点因不满足业务需要而扩大为分散式的多节点的解决思路。钻研的就是如何将多个计算机的资源合并为一个大的资源。 一、事务的 ACID 个性事务是复原和并发管制的根本单位。其具备四个个性(ACID): 原子性(atomicity) 一个事务是不可分割的工作单位,事务中的工作要么都实现,要么都不实现。一致性(consistency) 事务必须是使数据库从一个一致性的状态变到另一个一致性的状态。一致性与原子性密切相关。隔离性(isolation) 一个事务的执行不能被其余事务烦扰。即一个事务外部的操作及应用的数据对并发的其余事务是隔离的,并发执行的各个事务之间不能相互烦扰。持久性/永久性(durability) 一个事务一旦提交,对数据库中的数据的扭转是永久性的,接下来的任何其余操作或故障都不应该对其有任何影响。二、CAP 准则CAP 准则也称 CAP 定理,指一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)只能同时实现两点,不可能三者兼顾。 2.1 一致性在同一时间,所有的节点获取的数据是一样的数据。 一旦数据更新完并返回客户端后,那么分布式系统中的所有节点在同一时间获取到的同一份最新的数据。 所有的节点数据都须要同步为最新数据能力保障在取数据时是完全一致的。 如果只有两个节点,一个主节点和一个副节点,当客户端向主节点写数据时: 如果写入胜利,则新写入的数据也必须同步到副节点中,当客户端从副节点读取数据时,读取到的就是刚向主节点写入的数据。如果写入失败,主副节点的数据都不会有任何扭转。主副数据库的同步过程是须要上锁的,防止在此期间客户端从副节点获取到旧的数据导致从主副节点获取到的数据不统一的状况产生。 2.1.1 分布式一致性特点:因为存在数据同步的过程,写操作的响应会有肯定的提早为了保证数据一致性会对资源进行临时锁定,数据同步实现时再开释资源如果数据同步失败,在获取数据时将返回错误信息,而不是旧数据2.2 可用性每次申请都能获取到非错的响应,但非错就不能保障获取到的所有的数据都是最新数据。 可用性水平的规范如下表所示: 可用性分类可用性(%)年故障工夫容错可用性99.999932秒极高可用性99.9995分15秒具备故障主动恢复能力的可用性99.9952分34秒高可用性99.98小时46份商品可用性993天15小时36分可用性实现过程: 当主节点正在被更新时,副节点接管到数据查问的申请时会立刻响应数据查问后果副节点不能响应超时或响应谬误在谋求可用性时,在数据同步时不能上锁,所以应用异步申请进行数据同步。 2.3 分区容错性多个节点之间不能在时限范畴内达到数据一致性,就意味着产生了分区的状况,此时就必须在一致性和可用性之间做出抉择,以保障个别节点呈现故障时,零碎仍然能失常运行。 分区容错性是分布式系统要具备的最根本的能力。 必要实现流程: 尽量应用异步取代同步操作,这样节点之间能无效地实现松耦合增加更多的副节点,当其中一个呈现故障,其余副节点仍然能提供服务2.4 3选2该怎么选既然无奈同时满足 CAP 三个个性,而分区容错性又是分布式系统必须的个性,所以只能在可用性和一致性做出抉择。 2.4.1 放弃可用性如果一个分布式系统不要求强的可用性,即容许零碎停机或长时间无响应的话,就能够放弃可用性,谋求一致性和分区容错性。 场景举例: 跨行转账,一次转账申请要期待单方银行零碎都实现整个事务才算实现。 2.4.2 放弃一致性当初少数分布式系统谋求的都是 AP,高可用和分区容错,容许数据同步有肯定的提早(最终统一即可)。 场景举例: 抢购。在某些电商中常常会有一些热门的商品,因为供不应求,所以须要用户进行抢购。在抢购过程中,有很多用户明明曾经抢到了商品,且造成了订单,但在付款时却提醒商品已售完。这就是为了保证系统的失常运行,在数据一致性上做出了斗争,尽管会给一些用户带来不好的体验,但却能保障大部分用户的失常拜访浏览。 从付款失败时提醒商口告罄能够看进去,<u>数据最初还是统一的</u>。 三、BASE 准则BASE准则与CAP准则出自同一人之手,是Basically Available(根本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写,但这个缩写是特意拼凑的(ACID 也是特意拼凑的)。 BASE主张放弃一致性而谋求高可用性,但最初要应用适合的方法使零碎数据达成最终统一。 3.1 根本可用根本可用只能保证系统可用,零碎能够响应慢或者某些性能无奈失常应用。 例如,一个购物网站,失常时查问一件商品只须要100ms服务器就能返回商品数据,但零碎因为产生一些问题,最终查问用时减少到了5秒。 又如,这个购物网站有一个鼎力优惠的流动,导致访问量激增,为了保障此流动能顺利开展,当局部用户加入其余流动时可能间接跳转到主页或其余流动页面或返回流动已完结。 3.2 软状态软状态示意零碎的状态可能会随着工夫而扭转,即使没有任何数据输出,也会因为最终一致性而发生变化。 3.3 最终一致性各个节点在同一时间可能保留的数据不雷同,但随着时间推移,各个节点的数据将最终会统一。

May 28, 2021 · 1 min · jiezi

关于系统:浅谈-selectpoll-和-epoll

select、poll和epoll都是 IO 多路复用的机制,可能监听多个文件描述符的读/写事件。一旦某个描述符就绪(个别是读或写事件产生了),就可能将产生的事件告诉给关怀的应用程序去解决该事件。 实质上,select、poll和epoll都是同步 I/O 。 上面从根底开始总结一下三者的区别和分割。 1、什么是流、I/O和阻塞?1.1 流零碎中的流个别是指stream,与网络流flow要区别开。通常包含文件流、管道流、套接字流等。 流是对一种有序间断且具备方向性的数据的形象形容,是一个蕴含数据源、数据目的地和数据传输的过程。 上面是一个形象的比喻: 假如咱们有个大水缸,水缸里灌满了水,为了可能让水从大水缸里拿进去应用,就须要接一个水龙头,关上水龙头,水就进去了。可是大水缸除了放水,咱们还心愿能一直的蓄水,于是就须要有另外一个口能够给水缸蓄水,蓄水口默认是敞开的,每次都要关上蓄水口。假如咱们往大水缸里蓄水,水有 N 杯,咱们只能一杯一杯的往里灌,每次灌入就要关上蓄水口,为了进步蓄水速度,咱们想到了一个方法,筹备一个盆,每个盆只能装512杯水,当盆装满后,再从盆里往水缸里灌入。水就相当于计算机里的数据,而数据是有程序而且以字节形式存在的,出水口和入水口对应输入输出流,stdin 和 stdout,而前面加的盆就是外部缓冲区,大水缸就是咱们的磁盘,磁盘操作绝对于 cpu 的处理速度来说十分慢,所以为了提高效率,引入了外部缓冲区。流和文件描述符(fd)的关系:流给用户程序提供了更高一级的 I/O 接口,它处在文件描述符的下层。也就是说,流函数是通用文件描述符函数来实现的。 1.2 I/O操作所有对流的读写操作,都能够被称为 I/O 操作。 在流(次要指缓冲区)中,在没有数据可读的时候,或者说向一个曾经写满了数据的流再写数据时,IO 操作就会被挂起期待,这个挂起期待就是阻塞。 1.3 阻塞和非阻塞以送快递为例的场景举例: 你有一份快递和一个手机,快递送达时会打电话告诉你,而在此之前,你始终劳动,就是阻塞。但你是急性子,每分钟都要打电话问快递到没到,而快递员接电话和运输只能二选一,快递员在接电话时就会进行运输,这样很耽搁快递员的运输速度,这是非阻塞、忙轮询场景。阻塞时,不会占用 CPU 的工夫片,因为工夫片资源很贵重。 非阻塞、忙轮询时,会占用 CPU 工夫片,节约系统资源。 2、解决阻塞死期待在你只有一个人、一部手机(单线程)时,只能同时接一个快递员的电话或签收一个快递,其余快递员只能期待,这不仅节约本人的工夫,也节约快递员的工夫。 所以你须要多找一些人和一些手机(多线程或多过程)同时解决多个快递,这样就能提高效率。 2.1 非阻塞、忙轮询非阻塞、忙轮询的形式,能够让用户别离与每个快递员取得联系,尽管能够与多个快递员进行沟通(并发),然而快递员与用户沟通时会进行运输去接电话(节约 CPU )。 2.2 select如果开设一个代收点,让快递员把所有的快递全都送到这个代收点,当有快递时,代收点会给你打电话。但代收员不负责记录快递单号和数量,只会通知你有快递到了,并且只能解决1024个快递信息。 以读取 fd 为例: 最奢侈的需要就是关怀 N 个 fd 中是否有数据可读,也就是咱们期待“可读”事件的告诉,而不是自觉地对每个fd调用接管函数(recv)来尝试接收数据。咱们应该阻塞在期待事件,当阻塞解除的时候,就意味着,肯定有一个或多个fd中有可读的数据。但咱们不晓得哪个 fd 中会有读事件产生,所以当咱们晓得有可读事件时,还是要遍历所有的 fd 才查找哪个 fd 是可读的。 伪码: while true { select(fds[...]); // 阻塞 // 有音讯送达 for fd in fds[...] { if fd has 数据 { 解决数据 } }}当用户过程(或线程)调用 select 的时候, select 会将须要监控的 read_fds 汇合拷贝到内核空间(假如仅监控可读fd),而后遍历本人监控的 fd ,挨个调用 fd 的 poll 逻辑以便查看 fd 是否有可读事件。遍历完所有的 fd 后,如果没有任何一个 fd 可读,那么 select 就会调用schedule_timeout进入延时唤醒状态,使用户过程进入睡眠。如果在timeout工夫内某个 fd 有数据可读,或者睡眠工夫达到timeout了,用户过程就会被唤醒,开始遍历它监控 fd 汇合,挨个收集可读事件返回给用户。 ...

May 28, 2021 · 2 min · jiezi

关于系统:得物技术的交易轨迹系统

咱们不生产数据,咱们只是数据的搬运工。 背景现有零碎操作日志都扩散在各个域的零碎中,而且没有造成标准的零碎。导致排查线上问题全是去日志零碎各种搜,效率很低。咱们针对零碎调用链路有trace串联,跨域查问题很爽。然而咱们对单据纬度没有trace串联,单据流转对于咱们来说是黑盒。开发人员对本人的性能线上状况不分明,比方:每天卖家发货量多少?不分明;成功率多少?不分明;均匀响应多少?不分明;针对以后量,咱们是不是须要做一些优化?其实有时候并不是不去关注,只是没有一个很直观的零碎去很直观的出现进去。为了解决上述问题,交易轨迹零碎就应运而生了。实现思路怎么去埋数据?1. 计划一:手动埋点(不举荐)对现有零碎侵入性较高,而且埋点对系统稳定性有肯定的影响,不到万不得已不举荐。然而咱们提供了这项性能。反对三种接入形式,feign、dubbo和rocketmq。 2. 计划二:日志荡涤(举荐)怎么对现有零碎不革新,利用现有的资源去寻找事件action?咱们发现access.log能够完满的利用起来。然而有一些超时工作和mq触发的工作没有access.log,现阶段须要思考其余形式接入。后续咱们思考提供公共工具,将mq和超时工作触发的动作,写入access.log并提供全套的荡涤入库套件。 3. 计划三:binlog(不举荐)为什么不举荐,因为binlog拉取不到入参出参,对排查问题没有太大的作用。然而有一点劣势很显著,咱们能够追踪前后两次的表更。比方:批改地址(A地址->B地址) 怎么去数据荡涤?1. 性能独立和业务零碎隔离,独立一套零碎去做数据荡涤 2. 实时失效利用groovy脚本做荡涤逻辑,脚本写好后保留实时失效。 3. 数据扩大日志外面的数据不满足埋点需要,咱们提供了dubbo和feign的扩大,能够去业务零碎查问数据 4. 批量操作反对批量操作会波及到多个单号的流转,脚本默认返回List,对多个单号进行埋点,反对一次解析,多条数据落库 5. 奴才单号反对(同理批量操作) 6. 日志太简单?解析吃力?针对日志剖析,咱们提供的公共的数据获取工具,间接调用办法即可 例子(寄售申请): package com.shizhuang.duapp.trade.script.biz.deposit.jsimport com.alibaba.fastjson.JSONArrayimport com.alibaba.fastjson.JSONObjectimport com.google.common.collect.Listsimport com.shizhuang.duapp.trade.cycle.api.resultdata.BizResultimport com.shizhuang.duapp.trade.cycle.api.script.AccessLogToBizResultBaseScriptimport com.shizhuang.duapp.trade.cycle.api.sourcedata.AccessLogDataimport com.shizhuang.duapp.trade.cycle.api.util.AccessLogUtils/** * @program: trade-cycle-center * * @author: 小猪佩奇* * @create: 2020-11-20 17:08 * */class ConsignApplyCreate2BizResult extends AccessLogToBizResultBaseScript { List<BizResult> parse(AccessLogData accessLogData) { // 响应后果 String responseData = accessLogData.getResponseData() // 执行工夫 String takeTime = accessLogData.getTakeTime() // http 返回code码 String httpStatus = accessLogData.getHttpStatus() // 获取uid String uid = AccessLogUtils.getUid(accessLogData) List<String> applyNoList = this.analyzeApplyItemNo(responseData); List<BizResult> bizResultList = Lists.newArrayList(); for (applyItemNo in applyNoList) { BizResult result = new BizResult() result.setOperatorId(uid) result.setOperationBizNo(applyItemNo) result.setOperationTime(accessLogData.getOperationTime()) result.setOperationSubType("app寄售申请") result.setOperationTrace(accessLogData.getOperationTrace()) result.setOperationCostTime(Long.valueOf(takeTime)) result.setOperationResult("200" == httpStatus ? 0 : 1) //result.setOperationExtend() result.setOperationDetailReq(accessLogData.getPayload()) result.setOperationDetailResp(accessLogData.getResponseData()) bizResultList.add(result); } return bizResultList; } /** * 剖析单号 * @param responseData * @return */ List<String> analyzeApplyItemNo(String responseData) { List<String> list = Lists.newArrayList() JSONObject jsonObject = JSONObject.parseObject(responseData) JSONObject data = jsonObject.getJSONObject("data") JSONObject applyProduct = data.getJSONObject("applyProduct") if (Objects.isNull(applyProduct)) { return list } JSONArray applyItems = applyProduct.getJSONArray("applyItems") if (Objects.nonNull(applyItems)) { for (Object applyItem : applyItems) { JSONObject parseObject = JSONObject.parseObject(applyItem.toString()) String applyItemNo = parseObject.getString("applyItemNo"); list.add(applyItemNo); } } return list }}怎么去做数据出现?1. 单据纬度 ...

December 31, 2020 · 1 min · jiezi

关于系统:线上开票系统设计实践

导读:为响应国家号召,晋升业务效率,更好的服务企业用户,云信于9月末上线了线上开票性能。本文次要介绍了发票相干的基本知识,以及如何实现线上开票性能,遇到的问题和解决方案。 文|璐西 夜雨 2020年9月29日,税务总局等十三部门联结公布《对于推动征税缴费便利化改革优化税收营商环境若干措施的告诉》,指出要稳步推动发票电子化改革,促成办税提速增效降负,2020年底前根本实现新办纳税人增值税专用发票电子化。 为了晋升业务效率,更好的服务于企业客户,同时响应政策号召,网易云信2020年9月起反对线上开具电子发票,增值税一般电子发票将能够脱离线下人工开票流程,间接在线上实现主动开票。小小的一张发票背地,是一套集用户后盾、业务后盾、第三方平台于一体的线上开票零碎。线上开票场景实用于各类行业,只有产生线上交易,无论toB 还是 toC,均会波及。 本文次要从财税常识科普、产品设计、技术设计多个维度分享线上增值税开票零碎的实际,心愿能对大家有所帮忙。 财务常识科普 在进行线上开票零碎的设计之前,须要深刻理解相干背景常识,这样能力了解整个业务流程。相干阐明次要基于外部设计开展,仅供参考。 1.传统开票形式 一家新企业须要先到税局申请发票,再向税控服务公司购买税控设施。税控设施装置好后,再携带税盘(金税盘或税控盘)到主管税务机关初始发行,发行后到柜台领用发票。之后企业税务人员就能够装置开票软件,进行企业外部的线下开票了(纸质或电子)。 金税盘、税控盘:俗称白盘,黑盘,分属于两个不同的协税公司,金税盘属于航天信息,税控盘属于百旺。 2.发票信息 以电子普通发票为例,一张发票次要波及以下几个重点信息,理解了这些信息对后续第三方平台的对接会有很大帮忙。 购买方信息: 名称:若购买方为B端企业/组织,则此处应填写增值税纳税人的名称,纳税人辨认号,地址、电话,开户银行及账号,并确保单位名称和纳税人登记号的相应关系准确无误。若购买方为集体,则须要填写集体身份证姓名。订单信息: 服务名称:由商品名称+商品服务类型组成。个别格局为商品名称商品服务类型商品服务类型,和税收分类编码对应,第三方开票平台会依据税收分类编码主动生成商品服务类型,如信息技术服务技术服务费。 单价:这里指不含税单价,计算公式为不含税单价=round(不含税金额/数量, 8),保留8位小数,舍入模式为四舍五入。金额:这里指不含税商品金额,每个企业都会有对应的发票限额,需提前与税务确认限额,单张发票的总金额不能超过限额,超过后须要零碎主动拆分为多张。税率:不同的税收分类编码对应不同的税率。税额:国家收取的税收金额,计算公式为 税额=round((数量×含税单价)×税率)÷(1+税率),2),保留2位小数,舍入模式是四舍五入。价税共计:即单张发票的含税总金额。 若供给两种不同税率的应税我的项目,且合并开具发票的,其商品或劳务的名称、计量单位、数量、单价、金额,必须按不同税率别离填写。对供给的货物既有应税货物,又有免税货物的,供给的免税货物应独自开具普通发票,不得和应税货物合并开具增值税专用发票。销售方信息: 名称等:销售方企业名称和后续单方合同的乙方名称需保持一致。且名称、证件号需非法无效。收款人:个别为销售方财务人员,可与公司财税人员确认。复核:个别为销售方财务人员,可与公司财税人员确认。开票人:个别为销售方税务人员,可与公司财税人员确认。销货清单: 当发票上的订单信息超过货物或应税劳务、服务名称一栏展现范畴时,会生成用于记录残缺订单信息的销售货物或者提供应税劳务、服务清单,发票货物或应税劳务、服务名称一栏内容为(详见销货清单)。 3.发票类型 发票次要分为以下几类,线上开票仅波及增值税普通发票(以下简称普票)及增值税专用发票(以下简称专票),除电子发票可线上主动开票外,纸质发票的业务逻辑也须要一并兼容。 4.常见术语 蓝票、红票:失常开具发票为“蓝票”,呈现退货或开具的发票有谬误,须要作废发票或开具“红票”(也叫负票)用以冲减当期开票方的销售收入(也叫红冲)。 如果是增值税专用发票,在同一个月开票退货且发票未认证的,可间接作废发票;跨月退票的,须要红冲,开具负(红字)发票,冲减当期销售;如已通过同认证的,需购货方税务局出具《开具红字发票通知单》,销货方凭此《通知单》能力开具红字(正数)发票。此流程个别须要线下解决。 产品设计 相熟了基本知识,在正式进入线上开票零碎的产品设计之前,须要进行第三方开票平台的选型。确定选型后联合第三方平台的接口,梳理业务流程及相干性能点。 第三方开票平台 中国电子发票产业链的外围环节包含税控设施商和第三方电子发票服务平台。 税控设施商是国有控股的爱信诺、百旺双寡头格局。第三方电子发票服务平台次要分为三大营垒,包含百望股份、高灯科技为代表的新兴企业;由税控设施商、传统纸质发票印刷商组成的老牌发票服务商;以用友、金蝶为代表的老牌软件服务商。能够依据企业状况,抉择第三方开票平台。 企业可通过第三方平台接口实现于自有零碎对接,可抉择自行同步发票,也可抉择扫码开票。后者在线下门店开票中较为常见。 业务流程 依据业务特点进行需要剖析,设计适宜本人业务的开票流程。此过程倡议与财税同学放弃亲密沟通,防止设计进去的开票流程不合乎财税要求。 订单领取实现后,以电子发票线上开票及退票为例,次要业务流程(含状态流转)参考如下: 阐明: 为了升高发票的退票率及虚开发票的危险,设计中退出了实名认证的环节,确保发票低头和证件号真实有效,且一一对应。局部历史数据(历史曾经线下开过票的订单),可思考通过下单或领取工夫进行限度,躲避反复开票的危险。财务审核环节可依据公司财税要求确定是否须要保留,但纸质发票流程个别都会波及到后盾审核。性能 线上开票零碎次要波及用户和业务后盾,外围性能点参考下图: 阐明: 对于后盾操作人员来说,批量解决能够很大水平上晋升工作效率。不同的发票状态对应不同的操作类型。销售后盾需思考纸质发票的作废流程。纸质发票的快递状态跟踪也可思考作为低优先级性能逐渐优化。其余业务场景 理论业务中,还会波及一些非凡场景,如提前开票、退款退票等。 提前开票,即客户先开发票再进行领取。很多大企业外部报销审核严格,须要销售方先开具发票,而后依据发票报销打款。 退款退票,即客户购买后,因为各种起因进行了退款操作,蕴含全副退款或局部退款。如果曾经开具发票,则须要同步实现退票流程。针对全副退款的状况,只须要走失常退票流程即可。但针对局部退款的状况,原来曾经开具发票的须要整体退票之后,再开具残余未退款金额的发票。 这些非凡场景也须要实现线上化,通过零碎闭环所有开票流程,其优先级可依据本身业务需要制订。 技术设计 对于技术人员来说,在设计任何一个零碎时首先都会遇到以下个问题: 零碎面向的使用者是谁?租户隔离要隔离什么数据?零碎的内部依赖有哪些,逻辑架构应该怎么设计?解决了上述问题后,就轮到咱们的开票零碎独有的外部业务问题了: 发票上的各项金额别离代表什么含意,如何计算?多订单合并开票或大额订单开票时,发票应该如何拆分?理顺了外部业务逻辑,最初就该思考如何对外提供服务,并尽量晋升服务体验,也就是要解决以下问题: 接口时序是怎么的,哪些步骤应该异步化?零碎使用者 通常对于一个集团公司来说,业务构造是出现金字塔形态的,即集团公司下有不同的子公司,子公司下有不同的产品线,但也偶然有一些产品线是由不同的子公司甚至内部公司组成。 因而咱们应该把终端产品线作为租户。 终端隔离 明确了零碎使用者,接下来就须要思考租户应该隔离哪些数据。 目前市面上的开票供应商提供的都是销方账户隔离,有两点限度: ...

October 21, 2020 · 1 min · jiezi

解析软件系统稳定性的三大秘密

摘要:随着软件复杂性越来越高,稳定性的保障越来越难,随着服务规模越来越大,稳定性的重要性越来越高。工程师在设计和开发软件的时候,要保持底板思维。何谓零碎稳定性?控制系统实践认为:零碎受到某种烦扰而偏离失常状态,当烦扰打消,如果零碎的扰动能逐步收敛并最终恢复正常状态,则零碎是稳固的;反之,零碎偏离越来越大,则是不稳固的,所以,稳定性是零碎抗干扰和返回均衡状态的能力。 对于经典的传递函数的软件系统,个别咱们讲的稳固指的是BIBO稳固,即有界输出有界输入稳固。一个零碎如果对任意有界输出失去有界输入,它就是BIBO稳固的。一句话,稳固的零碎对于各种输出须要有合乎预期的输入。 随着软件复杂性越来越高,稳定性的保障越来越难,随着服务规模越来越大,稳定性的重要性越来越高。阿里云CEO行癫把稳定性比喻成木桶的底板,如果稳定性出问题,则滴水不留,所以,工程师在设计和开发软件的时候,要保持底板思维。 咱们的软件需要和打算很少思考非性能局部,然而软件的构造和实现却有十分大的比重服务于此,这兴许是软件我的项目打算常常延期的重要起因。 如何保障稳定性?尽管实践上没有相对稳固的零碎,但咱们仍然能够有所作为,使咱们设计和开发的零碎在生产环境靠近稳固运行。 从大的方面讲,稳定性保障,能够分成3个局部: 制度纪律编码标准、代码提交门禁Code Review动态代码扫描,动静代码剖析Unit Test、压测灰度公布、Rollback、应急预案监控复盘、故障树剖析思维之道放弃简略、升高复杂度不(零)信赖、面向失败设计实际之术冗余设计(数据、计算、带宽冗余)疾速复原设计(无状态设计)容错、灾备隔离过载爱护(限流、熔断、有损服务)谬误重试策略,防止流量风暴去要害门路、去中心化、防止单点故障负载平衡(load balance)看门狗设计平安编码制度纪律通过制度去标准操作和行为,通过纪律去束缚大家在框架内流动,被证实是保障稳固缩小出错卓有成效的形式。 纪律是要害,只有坚持不懈的恪守制度,能力防止办法和规定沦为空谈。 但制度和纪律只是划出品质底线,只能解决大多数稳定性问题,难以发现一些隐匿的问题,须要配合思维之道和实际之术,继续改良软件品质,能力全面保障稳定性。 思维之道道是大的层面,它具备全局性的指导意义,我从泛滥的指导思想里,筛选最重要的两点:放弃简略和不信赖/面向失败设计,开展来讲。 1. 放弃简略简单是稳定性的天敌,放弃简略即保持稳定。繁多职责,性能清晰即是践行放弃简略。 把简略的货色搞简单很容易,而化繁为简则堪称化腐朽为神奇。所以放弃简略并不是低要求,它须要你透过表象洞悉事物本质,用最间接最土味的形式解决问题,做技术的同学有一个奇怪的嗜好,喜爱把本人最近推敲的货色用到我的项目中,不然总有锦衣夜行的感觉。 我的倡议是“学深用浅”。引入复杂性,一方面要衡量收益,另一方面要警觉伤害,要了解我的项目开发很多时候是团队单干,任何复杂性的引入都会对合作者提出更高要求,严以律人是危险的,低门槛才是合乎兽性的。 2. 不信赖设计、面向失败设计不信赖设计又叫零信赖设计,和面向失败的设计有相似之处,其本质都是防御性编程思维。 不信赖设计思维假如零碎依赖的上下游都不靠谱,假如四周都是好人,假如攻打无处不在。 网络服务须要对客户端申请参数做严格验证,不仅查看合法性,也要验证NaN。游戏开发有一句名言:假如客户端的数据都是假的。 过程内的函数调用大多时候很平安,会有可预期的后果,但如果跨过程调用(RPC)的可靠性则会低很多,有可能超时,有可能丢包,有可能失败,调用者必须意识并解决好各种异常情况,是重试?如果重试的话重试多少次?重试之间的距离应该怎么确定?申请的上下文怎么保留和复原? 咱们要正确理解不信赖设计的外延,防止使劲过猛,警觉借面向失败设计之名行有效编程之实,比方曾经对客户端申请数据做了严格校验,在服务器处理过程中,反复测验,比方曾经对接口入参判空,在外部调用过程中反复判断。这会升高代码浓度,混入大量有效代码,伤害可读性和执行效率,实质上是违反“放弃简略”准则的。 实际之术术是部分层面,它是实践经验,牵扯方方面面,难以尽数枚举。 如果以文章写作类比软件开发,谋篇布局相当于设计层面,设计层面要致广远,遣词造句相当于实现层面,实现层面要尽精微。 所谓千里之堤溃于蚁穴,防微杜渐功德无量。 1. 冗余设计冗余设计指留出平安余量,冗余包含数据冗余、计算冗余、带宽冗余。 数据冗余指一份数据多个正本,一主多备。 计算冗余,比方服务实例的QPS极限是10K,但实际上咱们会按5K跑,这样,即便呈现流量超速增长,咱们仍然有反应时间。 2. 疾速复原设计(无状态设计)互联网服务很多都是无状态设计,服务实例只是逻辑的盒子,前面跟着分布式一致性数据库,这样能极大简化设计,即便实例挂了,客户能够很容易迁徙到其余服务实例执行,而有状态设计则要简单难搞得多。 3. 容错、灾备容错指咱们的零碎要有肯定的谬误容忍能力,这象征谬误产生,咱们要能查错、检错、避错、甚至改错,只有可能,咱们就要吞咽谬误。 灾备这个大家耳熟能详,主从设计,异地备灾,指标都是为了应答各种极限状况。 4. 隔离隔离实质上就是说如果故障产生了,如果故障产生,而又不能吞咽,那也应该隔离防止谬误流传扩散,千方百计放大影响范畴,相当于感化新冠要被隔离起来。容器化等技术为隔离提供良好能力撑持。 5. 过载爱护熔断熔断机制不止软件设计独有,股市也有,我甚至狐疑软件的熔断机制是从股市学来的。 限流零碎设计要做好资源耗尽、资源不够用的状况,如果服务申请超过服务能力,那就应该限流,这应该作为一种配置,或者主动执行的策略。 这个跟地铁限流差不多,解决不了,那就排队。 有损服务有损服务我印象中最先是腾讯跟海量服务的概念一起提出来的,指如果呈现服务能力不够,不能为所有客户所有业务提供服务的异常情况,那零碎有所取舍,尽可能放弃业务运行,缩小损失,比方在微信服务器在解决能力无限的状况下,能够优先保音讯发送,而敞开朋友圈服务能力,比方直播业务在带宽无限的状况下,应该降低码率缩小清晰度,而不应该拒绝服务。 有损的意义就是有损失,有伤害的意思,它是一种思维,是退而求其次,是不得已而为之。 6. 谬误重试策略,防止流量风暴如果设计一个ToC服务,在客户大规模断连的状况下,客户会重连,重连失败再连,如果重连尝试的频率不管制好,失常客户端重连有可能演变成对服务器的大规模攻打,打爆一台服务器,又去灭另一台,这太吓人了。 能够参考kernel TCP的重连策略,有最大尝试次数,而且重试距离是逐步拉大的。 7 去要害门路、去中心化、防止单点故障企业不要要害学生,要害学生会成为瓶颈,软件也不能把宝压到一个中央,去中心化去集中式,没什么难了解的。 8 负载平衡load balance其实就是分担压力,LB要防止歪斜,有多种LB算法,比方RR,比方一致性hash,各有利弊,有趣味能够钻研下。 LB不仅限于服务,过程内的多线程可能也会须要思考这个问题。 9 看门狗和心跳机制能够参考kernel的watch dog,其实就是看护机制,检测谬误并致力掰过去。 10 平安编码平安编码是一个职业程序员的根本要求,平安编码规定很多,很细节的一些规矩。这个可能跟语言相干,如果是C++相干的能够参考:C++的门门道道 C相干的规定要少一些,我棘手列举一些。比方要留神初始化。比方全局变量不要有结构程序的依赖。比方慎用强转,强转等于接管了编译帮你做的类型查看。比方了解线程平安函数,了解可重入的概念,了解信号机制。比方要防止死锁,了解ABBA锁了解自死锁。比方要谨防资源透露。比方解决好内存调配失败的状况,了解野/悬垂指针。比方要解决好边界,避免越界,溢出。比方内存拷贝要防止内存重叠,了解memmove的用处。比方了解递归的低效和栈的大小限度,防止爆栈。比方倡议应用STD平安版本函数(_s+n)版本。比方理解unsigned < 0导致死循环的状况。比方理解浮点数跟0比拟的问题。比方了解整型数据溢出和反转。比方不要返回长期变量的援用或者指针,了解栈帧动静伸缩的原理。比方了解做好把关查看的必要性,包含零碎把关和模块把关。小结最初来读段经典:《系统化思维导论》一书中援用冯诺依曼的话写道:如果你察看一些自动装置,不管它们是人类设计的还是自然界原本就存在的,你通常会发现,它们的构造很大水平上受控于它们可能生效的形式,以及针对生效所采取的防御性措施(多少有些成果),说它们能预防生效有点夸大,它们不是能预防生效的,只是被设计成试图达到这种状态,这样至多大部分生效都不会是毁灭性的。所以,基本谈不上打消生效,或齐全打消生效带来的影响。咱们能尝试的只是设计一种自动装置,在大部分生效产生时仍能持续工作,这种安装加重了生效的结果,而不是治愈生效,大部分人造的和自然界存在的自动装置,其外部原理都是如此。 点击关注,第一工夫理解华为云陈腐技术~

July 15, 2020 · 1 min · jiezi

建议收藏可提升系统-10-倍性能的-10-个建议

译者:为之漫笔起源:http://www.zcfy.cc/article/10...原文:https://www.nginx.com/blog/10... 一个网站到底多快才行?页面加载每花1秒钟,就有大概4%的用户走掉。排名最靠前的电商站点的首次交互工夫为1至3秒,这个区间的转换率最高。不言而喻,Web利用性能的重要性一劳永逸。 晋升性能其实不难,难的是怎么看到后果。本文给出可能晋升大概10倍网站性能的10个倡议供大家参考。如此全面地涵盖各种性能优化技术,这还是头一回,但这些倡议可能须要NGINX的一点反对。除了性能,这些倡议也会波及晋升安全性。 倡议一:应用反向代理服务器让利用更快更平安 如果你的Web利用只跑在一台机器上,那要晋升其性能非常简单:换一台更快的,多配几个处理器,多加几条内存,磁盘阵列也要高速的。换了当前,这台机器上跑的WordPress服务器、Node.js或Java利用速度都会放慢。(要是利用还会拜访另一台数据库服务器,那也简略:找两台更快的机器,用更快的网络连起来就行了。) 麻烦在于,机器速度并不是问题。很多时候Web利用慢,是因为要在各种工作之间切换,一会儿要解决数千个连贯上的用户申请,一会儿要向磁盘读写文件,一会儿又要运行利用的代码,一会儿又要去干别的。应用服务器因而可能呈现各种情况,耗尽内存、交换文件,或者让很多申请期待一个硬盘I/O之类的工作。 ▼ 除了降级硬件,其实你还能够抉择另外一种齐全不同的办法:加一台反向代理服务器,分担上述一些工作。反向代理服务器位于运行利用的机器之前,负责解决来自外网的申请。反向代理服务器间接连到互联网,它与应用服务器通信应用的是疾速的外部网络。 反向代理服务器能够让应用服务器专一于构建页面,而后交给反向代理向外网发送,而不用理睬用户与利用的交互。因为不用期待客户端的响应,应用服务器的运行速度能达到靠近最优的程度。 减少反向代理服务器同时也能够为Web服务器削减灵活性。比方,假如执行某种工作的服务器过载了,那随时能够再减少一台同类服务器;而如果这台服务器挂了,替换它也很容易。 ▼ 鉴于这种灵活性,反向代理服务器往往也是其余性能优化伎俩的先决条件,比方: 负载平衡(参见“倡议二”),反向代理服务器上运行负载平衡服务,把流量平均分配给几台应用服务器。有了负载平衡,增加应用服务器基本不须要批改利用。缓存动态文件(参见“倡议三”),图片或代码之类的能够间接申请的文件,都能够保留在反向代理服务器中,以便间接发给客户端。这样不仅能够更快地响应申请,还能加重应用服务器的累赘,放慢其运行速度。保障站点平安,能够配置反向代理服务器晋升其安全级别,通过它监控来疾速辨认和响应攻打,从而保留应用服务器平安。NGINX专门为应用反向代理服务器做了设计,使其人造反对上述优化。因为应用事件驱动的解决机制,NGINX比传统服务器效率更高。NGINX Plus则减少了更高端的反向代理性能,如利用体检、特有的申请路由、高级缓存和售后反对。 传统服务器与NGINX Worker的比拟 倡议二:减少负载平衡服务器 增加负载平衡服务器绝对简略,但却能显著晋升站点性能和安全性。通过它把流量调配给多个服务器,就能够不用降级Web服务器了。就算利用自身写得不太好,或者难以扩大,负载平衡都能够在不做其余扭转的状况下晋升用户体验。 负载平衡服务器首先是一个反向代理服务器(参见“倡议一”),负责把来自互联网的申请转发给其余服务器。这里关键在于负载平衡服务器能够反对两台以上的应用服务器,应用一种抉择算法在不同的服务器间调配申请。最简略的负载平衡算法是循环调度,即把新申请顺次转发给可用服务器中的下一台服务器。其余算法还有把申请发给流动连贯起码的服务器。NGINX Plus反对一种性能,就是把用户会话放弃在同一台服务器上,叫做会话放弃。 ▼ 负载平衡服务器能够防止一台服务器过载而其余服务器过闲,从而极大晋升性能。同时,有了它还能够让Web服务器扩容更简略,因为能够选用比拟便宜的服务器,同时保障物尽其用。 能够通过负载平衡调度的协定包含HTTP、HTTPS、SPDY、HTTP/2、WebSocket、FastCGI、SCGI、uwsgi、memcached,以及其余一些利用模式,包含基于TCP的利用和其余第四层的协定。为此,首先要剖析Web利用,看性能短板在哪里,而后再确定应用哪一个。 同一台服务器或用于负载平衡的服务器也能够承当其余工作,比方SSL终止、视客户端不同反对HTTP/1/x或HTTP/2、缓存动态文件。 NGINX常常被用来做负载平衡,更多信息请参考咱们以前发的介绍性文章、无关配置的文章、电子书和相干的在线视频,当然还有文档。咱们的商业版本NGINX Plus反对更多的负载平衡性能,如基于服务器响应工夫路由负载和反对微软NTLM协定的负载平衡。 倡议三:缓存动态及动静内容 缓存能晋升Web利用性能,因为能够更快地把内容交付给客户端。缓存的策略包含预处理内容、在较快的设施上存储内容、把内容保留在凑近客户端的中央,以及同时使用这些策略。 缓存有两种。 动态内容缓存,不常变动的文件,如图片(JPEG、PNG)和代码(CSS、JavaScript),能够保留在边缘服务器中,以便疾速从内容或磁盘中获取。动静内容缓存,很多Web利用会为每个页面申请生成全新的HTML,把生成的每个HTML都缓存一小段时间,可能显著缩小须要生成的页面总数,同时又能够保障交付的内容足够陈腐。假如一个页面每秒被查看10次,而你缓存它1秒,那么90%针对这个页面的申请都将来自在缓存。如果你独自缓存动态内容,那么即便全新生成的页面,很可能大部分都来自缓存的内容。 ▼ 缓存Web利用生成内容的技术次要分三种。 把内容放到离用户近的中央。离用户近,传输工夫少。把内容放到较快的机器上。机器快,检索速度快。把内容从适度应用的机器中拿走。有时候机器会比在专一执行特定工作时慢很多,那是因为太多任务让它们分心。这时候把内容拿到其余机器上,不仅对缓存的内容有益处,对非缓存的内容同样无利,因为托管它们的主机的累赘加重了。Web利用的缓存能够在Web应用服务器外部或内部实现。首先,思考缓存动静内容,以加重应用服务器的负载。其次,缓存用于动态内容(包含那些动静生成内容的长期正本),进一步加重应用服务器的累赘。而后,思考把缓存转移到其余更快或更凑近用户的机器,给应用服务器减负,缩短传输工夫。 用好缓存能显著放慢利用的响应速度。对很多网页来说,大图片之类的静态数据,往往占据一半以上的内容。不必缓存,查问和传输这类数据可能会花好几秒钟,而用缓存,则可能只有花几分之一秒。 ▼ 能够举一个例子来阐明怎么应用缓存,NGINX和NGINX Plus通过两个指令来设置缓存:proxy_cache_path和proxy_cache指定缓存的地位和大小、最长缓存工夫以及其余参数。应用第三个(也是很受欢迎的)指令proxy_cache_use_stale,甚至能够通知缓存在原本应该提供陈腐内容的服务器太忙或宕机时,提供原来的旧文件,对客户端来说,拿到内容总比拿不到强。从用户角度看,这样也能够建立你的站点或利用十分稳固的形象。 NGINX Plus反对高级缓存性能,包含缓存污染(caching purging)和通过控制板以可视化的模式展现缓存状态,实现实时监控。 要理解NGINX中对于缓存的更多信息,能够看看参考文档和NGINX Plus Admin Guide中的NGINX Content Caching。 留神: 缓存波及开发、决策和运维,欠缺的缓存策略,比方本文提到的这些,可能体现从DevOps角度思考的价值。也说是说,开发人员、架构师、运维人员此时携手,独特保障一个网站的性能、响应工夫、平安和业务指标。倡议四:压缩数据 压缩同样能极大晋升性能。图片、视频、音乐等文件都有十分成熟和高效的压缩规范(JPEG和PNG、MPEG-4、MP3),任何一个规范都能够把文件大小放大一个数量级甚至更多。 文本文件,包含HTML(纯文本和HTML标签)、CSS和JavaScript代码,常常在不压缩的状况下传输。压缩这些数据对晋升Web利用的感知性能有时候特地显著,尤其是移动用户的网络很慢又不稳固的状况下。 因为文本数据通过对于页面交互可能起到必要的声援作用,而多媒体数据则更多是精益求精的作用。聪慧的内容压缩能够把HTML、JavaScript、CSS等文本内容的放大30%以上,因而可能相应地缩小加载工夫。 如果你应用SSL,压缩又能够缩小必须通过SSL编码的数据量,从而弥补了压缩这些数据的CPU工夫。 压缩数据的办法十分多。比方,倡议六中对于HTTP/2的局部就形容了一个新鲜的压缩思路,特地适宜首部数据压缩。还有一个对于文本压缩的例子,就是能够在NGINX中开启GZIP压缩。预压缩文本数据之后,能够应用gzip_static指令间接发送.gz文件。 倡议五:优化SSL/TLS 越来越多的网站在应用Secure Sockets Layer(SSL)及起初的Transport Layer Security(TLS)协定。SSL/TLS通过加密从源服务器发送给用户的数据来晋升网站安全性。Google会晋升应用SSL/TLS的网站的搜索引擎排名,将无力地推动这一过程。 只管采用率越来越高,但SSL/TLS造成的性能损失也困扰着很多网站。SSL/TLS拖慢网站的起因有两个。 1、每次关上新连贯的首次握手都必须创立加密密钥,而浏览器应用HTTP/1.x对每个2、服务器建设多个连贯的形式进一步加剧了这个问题。 服务器端加密数据和客户端解密数据的操作同样也是开销。 ...

July 10, 2020 · 1 min · jiezi

冰与火之歌居然是在 DOS 系统上写出来的

简评:《权力的游戏》第八季(最终季)终于开播了!这部美剧的原著小说有一个很有趣的冷知识 —— 它是在运行 DOS 系统的计算机上写出来的。其实不少老粉都已经知道这个典故,不过听到老爷子的亲自解释还是非常开心的。美剧『权力的游戏』是由小说『冰与火之歌』改编的,这部小说的作者 George R. Martin 可以说是非常传奇了,他不仅能够若无其事地把自己的角色都杀死,而且他还能神奇地让读者喜欢上自己笔下的坏人。有一次他在一档脱口秀中告诉主持人 —— 他写作的工具是一台运行 DOS 系统的电脑。嗯?!你说的是没有鼠标,全靠敲命令行进行操作的那个系统吗?是的!写作软件则是著名的 WordStar 4.0,一款上世纪 80 年代的文字处理软件。注: 戳链接吧各位,我出生在图形用户界面的时代,没听过这个……「如果我想写『capital』这个词,我就输入『capital』,我也知道 shift 键是做什么用的。而现代软件的自动校正功能让我头大,如果我每次写到『Winterfell』『Daenerys Targaryen』时都会反复被软件智能纠错,那我觉得不行。」George R.R. Martin 这么解释到。Martin 喜欢老式写作软件的简洁,不需要自动纠正或者词语联想。当然,他有两台电脑,在不写作的时候会用另一台电脑上网和收发邮件。原文链接:冰与火之歌居然是在 DOS 系统上写出来的推荐阅读:Chrome 小恐龙背后的故事 | 设计师专访欢迎关注微信号「极光开发者」

April 15, 2019 · 1 min · jiezi

Linux 的进程间通信:管道

本文由云+社区发表作者:邹立巍版权声明:本文章内容在非商业使用前提下可无需授权任意转载、发布。转载、发布请务必注明作者和其微博、微信公众号地址,以便读者询问问题和甄误反馈,共同进步。微博ID:orroz微信公众号:Linux系统技术前言管道是UNIX环境中历史最悠久的进程间通信方式。本文主要说明在Linux环境上如何使用管道。阅读本文可以帮你解决以下问题:什么是管道和为什么要有管道?管道怎么分类?管道的实现是什么样的?管道有多大?管道的大小是不是可以调整?如何调整?什么是管道?管道,英文为pipe。这是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期shell的发明人。他在发明了shell之后,发现系统操作执行命令的时候,经常有需求要将一个程序的输出交给另一个程序进行处理,这种操作可以使用输入输出重定向加文件搞定,比如:[zorro@zorro-pc pipe]$ ls -l /etc/ > etc.txt[zorro@zorro-pc pipe]$ wc -l etc.txt 183 etc.txt但是这样未免显得太麻烦了。所以,管道的概念应运而生。目前在任何一个shell中,都可以使用“|”连接两个命令,shell会将前后两个进程的输入输出用一个管道相连,以便达到进程间通信的目的:[zorro@zorro-pc pipe]$ ls -l /etc/ | wc -l183对比以上两种方法,我们也可以理解为,管道本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于是就实现了通信。实际上管道的设计也是遵循UNIX的“一切皆文件”设计原则的,它本质上就是一个文件。Linux系统直接把管道实现成了一种文件系统,借助VFS给应用程序提供操作接口。虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。在Linux的实现上,它占用的是内存空间。所以,Linux上的管道就是一个操作方式为文件的内存缓冲区。管道的分类和使用Linux上的管道分两种类型:匿名管道命名管道这两种管道也叫做有名或无名管道。匿名管道最常见的形态就是我们在shell操作中最常用的”|”。它的特点是只能在父子进程中使用,父进程在产生子进程前必须打开一个管道文件,然后fork产生子进程,这样子进程通过拷贝父进程的进程地址空间获得同一个管道文件的描述符,以达到使用同一个管道通信的目的。此时除了父子进程外,没人知道这个管道文件的描述符,所以通过这个管道中的信息无法传递给其他进程。这保证了传输数据的安全性,当然也降低了管道了通用性,于是系统还提供了命名管道。我们可以使用mkfifo或mknod命令来创建一个命名管道,这跟创建一个文件没有什么区别:[zorro@zorro-pc pipe]$ mkfifo pipe[zorro@zorro-pc pipe]$ ls -l pipe prw-r–r– 1 zorro zorro 0 Jul 14 10:44 pipe可以看到创建出来的文件类型比较特殊,是p类型。表示这是一个管道文件。有了这个管道文件,系统中就有了对一个管道的全局名称,于是任何两个不相关的进程都可以通过这个管道文件进行通信了。比如我们现在让一个进程写这个管道文件:[zorro@zorro-pc pipe]$ echo xxxxxxxxxxxxxx > pipe 此时这个写操作会阻塞,因为管道另一端没有人读。这是内核对管道文件定义的默认行为。此时如果有进程读这个管道,那么这个写操作的阻塞才会解除:[zorro@zorro-pc pipe]$ cat pipe xxxxxxxxxxxxxx大家可以观察到,当我们cat完这个文件之后,另一端的echo命令也返回了。这就是命名管道。Linux系统无论对于命名管道和匿名管道,底层都用的是同一种文件系统的操作行为,这种文件系统叫pipefs。大家可以在/etc/proc/filesystems文件中找到你的系统是不是支持这种文件系统:[zorro@zorro-pc pipe]$ cat /proc/filesystems |grep pipefsnodev pipefs观察完了如何在命令行中使用管道之后,我们再来看看如何在系统编程中使用管道。PIPE我们可以把匿名管道和命名管道分别叫做PIPE和FIFO。这主要因为在系统编程中,创建匿名管道的系统调用是pipe(),而创建命名管道的函数是mkfifo()。使用mknod()系统调用并指定文件类型为为S_IFIFO也可以创建一个FIFO。使用pipe()系统调用可以创建一个匿名管道,这个系统调用的原型为:#include <unistd.h>int pipe(int pipefd[2]);这个方法将会创建出两个文件描述符,可以使用pipefd这个数组来引用这两个描述符进行文件操作。pipefd[0]是读方式打开,作为管道的读描述符。pipefd[1]是写方式打开,作为管道的写描述符。从管道写端写入的数据会被内核缓存直到有人从另一端读取为止。我们来看一下如何在一个进程中使用管道,虽然这个例子并没有什么意义:[zorro@zorro-pc pipe]$ cat pipe.c#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#define STRING “hello world!“int main(){ int pipefd[2]; char buf[BUFSIZ]; if (pipe(pipefd) == -1) { perror(“pipe()”); exit(1); } if (write(pipefd[1], STRING, strlen(STRING)) < 0) { perror(“write()”); exit(1); } if (read(pipefd[0], buf, BUFSIZ) < 0) { perror(“write()”); exit(1); } printf("%s\n”, buf); exit(0);}这个程序创建了一个管道,并且对管道写了一个字符串之后从管道读取,并打印在标准输出上。用一个图来说明这个程序的状态就是这样的:一个进程自己给自己发送消息这当然不叫进程间通信,所以实际情况中我们不会在单个进程中使用管道。进程在pipe创建完管道之后,往往都要fork产生子进程,成为如下图表示的样子:如图中描述,fork产生的子进程会继承父进程对应的文件描述符。利用这个特性,父进程先pipe创建管道之后,子进程也会得到同一个管道的读写文件描述符。从而实现了父子两个进程使用一个管道可以完成半双工通信。此时,父进程可以通过fd[1]给子进程发消息,子进程通过fd[0]读。子进程也可以通过fd[1]给父进程发消息,父进程用fd[0]读。程序实例如下:[zorro@zorro-pc pipe]$ cat pipe_parent_child.c#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>#define STRING “hello world!“int main(){ int pipefd[2]; pid_t pid; char buf[BUFSIZ]; if (pipe(pipefd) == -1) { perror(“pipe()”); exit(1); } pid = fork(); if (pid == -1) { perror(“fork()”); exit(1); } if (pid == 0) { /* this is child. / printf(“Child pid is: %d\n”, getpid()); if (read(pipefd[0], buf, BUFSIZ) < 0) { perror(“write()”); exit(1); } printf("%s\n”, buf); bzero(buf, BUFSIZ); snprintf(buf, BUFSIZ, “Message from child: My pid is: %d”, getpid()); if (write(pipefd[1], buf, strlen(buf)) < 0) { perror(“write()”); exit(1); } } else { / this is parent / printf(“Parent pid is: %d\n”, getpid()); snprintf(buf, BUFSIZ, “Message from parent: My pid is: %d”, getpid()); if (write(pipefd[1], buf, strlen(buf)) < 0) { perror(“write()”); exit(1); } sleep(1); bzero(buf, BUFSIZ); if (read(pipefd[0], buf, BUFSIZ) < 0) { perror(“write()”); exit(1); } printf("%s\n”, buf); wait(NULL); } exit(0);}父进程先给子进程发一个消息,子进程接收到之后打印消息,之后再给父进程发消息,父进程再打印从子进程接收到的消息。程序执行效果:[zorro@zorro-pc pipe]$ ./pipe_parent_child Parent pid is: 8309Child pid is: 8310Message from parent: My pid is: 8309Message from child: My pid is: 8310从这个程序中我们可以看到,管道实际上可以实现一个半双工通信的机制。使用同一个管道的父子进程可以分时给对方发送消息。我们也可以看到对管道读写的一些特点,即:在管道中没有数据的情况下,对管道的读操作会阻塞,直到管道内有数据为止。当一次写的数据量不超过管道容量的时候,对管道的写操作一般不会阻塞,直接将要写的数据写入管道缓冲区即可。当然写操作也不会再所有情况下都不阻塞。这里我们要先来了解一下管道的内核实现。上文说过,管道实际上就是内核控制的一个内存缓冲区,既然是缓冲区,就有容量上限。我们把管道一次最多可以缓存的数据量大小叫做PIPESIZE。内核在处理管道数据的时候,底层也要调用类似read和write这样的方法进行数据拷贝,这种内核操作每次可以操作的数据量也是有限的,一般的操作长度为一个page,即默认为4k字节。我们把每次可以操作的数据量长度叫做PIPEBUF。POSIX标准中,对PIPEBUF有长度限制,要求其最小长度不得低于512字节。PIPEBUF的作用是,内核在处理管道的时候,如果每次读写操作的数据长度不大于PIPEBUF时,保证其操作是原子的。而PIPESIZE的影响是,大于其长度的写操作会被阻塞,直到当前管道中的数据被读取为止。在Linux 2.6.11之前,PIPESIZE和PIPEBUF实际上是一样的。在这之后,Linux重新实现了一个管道缓存,并将它与写操作的PIPEBUF实现成了不同的概念,形成了一个默认长度为65536字节的PIPESIZE,而PIPEBUF只影响相关读写操作的原子性。从Linux 2.6.35之后,在fcntl系统调用方法中实现了F_GETPIPE_SZ和F_SETPIPE_SZ操作,来分别查看当前管道容量和设置管道容量。管道容量容量上限可以在/proc/sys/fs/pipe-max-size进行设置。#define BUFSIZE 65536……ret = fcntl(pipefd[1], F_GETPIPE_SZ);if (ret < 0) { perror(“fcntl()”); exit(1);}printf(“PIPESIZE: %d\n”, ret);ret = fcntl(pipefd[1], F_SETPIPE_SZ, BUFSIZE);if (ret < 0) { perror(“fcntl()”); exit(1);}……PIPEBUF和PIPESIZE对管道操作的影响会因为管道描述符是否被设置为非阻塞方式而有行为变化,n为要写入的数据量时具体为:O_NONBLOCK关闭,n <= PIPE_BUF:n个字节的写入操作是原子操作,write系统调用可能会因为管道容量(PIPESIZE)没有足够的空间存放n字节长度而阻塞。O_NONBLOCK打开,n <= PIPE_BUF:如果有足够的空间存放n字节长度,write调用会立即返回成功,并且对数据进行写操作。空间不够则立即报错返回,并且errno被设置为EAGAIN。O_NONBLOCK关闭,n > PIPE_BUF:对n字节的写入操作不保证是原子的,就是说这次写入操作的数据可能会跟其他进程写这个管道的数据进行交叉。当管道容量长度低于要写的数据长度的时候write操作会被阻塞。O_NONBLOCK打开,n > PIPE_BUF:如果管道空间已满。write调用报错返回并且errno被设置为EAGAIN。如果没满,则可能会写入从1到n个字节长度,这取决于当前管道的剩余空间长度,并且这些数据可能跟别的进程的数据有交叉。以上是在使用半双工管道的时候要注意的事情,因为在这种情况下,管道的两端都可能有多个进程进行读写处理。如果再加上线程,则事情可能变得更复杂。实际上,我们在使用管道的时候,并不推荐这样来用。管道推荐的使用方法是其单工模式:即只有两个进程通信,一个进程只写管道,另一个进程只读管道。实现为:[zorro@zorro-pc pipe]$ cat pipe_parent_child2.c#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>#define STRING “hello world!“int main(){ int pipefd[2]; pid_t pid; char buf[BUFSIZ]; if (pipe(pipefd) == -1) { perror(“pipe()”); exit(1); } pid = fork(); if (pid == -1) { perror(“fork()”); exit(1); } if (pid == 0) { / this is child. / close(pipefd[1]); printf(“Child pid is: %d\n”, getpid()); if (read(pipefd[0], buf, BUFSIZ) < 0) { perror(“write()”); exit(1); } printf("%s\n”, buf); } else { / this is parent / close(pipefd[0]); printf(“Parent pid is: %d\n”, getpid()); snprintf(buf, BUFSIZ, “Message from parent: My pid is: %d”, getpid()); if (write(pipefd[1], buf, strlen(buf)) < 0) { perror(“write()”); exit(1); } wait(NULL); } exit(0);}这个程序实际上比上一个要简单,父进程关闭管道的读端,只写管道。子进程关闭管道的写端,只读管道。整个管道的打开效果最后成为下图所示:此时两个进程就只用管道实现了一个单工通信,并且这种状态下不用考虑多个进程同时对管道写产生的数据交叉的问题,这是最经典的管道打开方式,也是我们推荐的管道使用方式。另外,作为一个程序员,即使我们了解了Linux管道的实现,我们的代码也不能依赖其特性,所以处理管道时该越界判断还是要判断,该错误检查还是要检查,这样代码才能更健壮。FIFO命名管道在底层的实现跟匿名管道完全一致,区别只是命名管道会有一个全局可见的文件名以供别人open打开使用。再程序中创建一个命名管道文件的方法有两种,一种是使用mkfifo函数。另一种是使用mknod系统调用,例子如下:[zorro@zorro-pc pipe]$ cat mymkfifo.c#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>int main(int argc, char argv[]){ if (argc != 2) { fprintf(stderr, “Argument error!\n”); exit(1); }/ if (mkfifo(argv[1], 0600) < 0) { perror(“mkfifo()”); exit(1); }/ if (mknod(argv[1], 0600|S_IFIFO, 0) < 0) { perror(“mknod()”); exit(1); } exit(0);}我们使用第一个参数作为创建的文件路径。创建完之后,其他进程就可以使用open()、read()、write()标准文件操作等方法进行使用了。其余所有的操作跟匿名管道使用类似。需要注意的是,无论命名还是匿名管道,它的文件描述都没有偏移量的概念,所以不能用lseek进行偏移量调整。关于管道的其它议题,比如popen、pclose的使用等话题,《UNIX环境高级编程》中的相关章节已经讲的很清楚了。如果想学习补充这些知识,请参见此书。此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号 ...

March 6, 2019 · 3 min · jiezi

为减少用户电话排队,阿里研发了智能客服调度系统

小叽导读:提到调度,大家脑海中可能想起的是调度阿里云的海量机器资源,而对于阿里集团客户体验事业群(CCO)而言,我们要调度的不是机器,而是客服资源。今天,我们邀请阿里高级技术专家力君,为大家分享自动、智能的客服调度系统——XSigma。背景一提到调度,大家脑海中可能想起的是调度阿里云的海量机器资源,而对于阿里集团客户体验事业群(CCO)而言,我们要调度的不是机器,而是我们的客服资源。为什么客服需要调度?CCO目前承接了阿里集团以及生态体的客户服务业务,我们的客户通过各个渠道来寻求解决各类问题,每天的进线量巨大,而且经常伴随着突发性进线,比如天猫代金券出了问题,在几分钟内就会造成几千通热线或在线咨询。面对种类繁多、海量、突发的客户问题,我们的服务能力往往难以满足,常常造成用户排队,甚至放弃,自然我们产生了对调度的需求。客服调度的核心问题是什么?提升客服资源的利用率和服务水平,用更少的客服资源获得更佳的用户体验。如果我们招聘大量的客服,也能让用户获得更好的体验,但是容易造成人力浪费,更多的人手意味着更多的培训成本、管理成本和人力成本。与机器调度相比,客服调度有它的复杂点:1)机房增加一台新物理机,机器虚拟化后就可以快速被使用,而招募一个新客服,得需要长时间的培训才能让他具备线上服务能力;2)客服间差别大,不同客服的业务技能有区别,很难直接让B技能组的客服处理A技能组的任务,即使是掌握同一技能的客服,他们的服务能力也有大的差别,而机器差别不大,很多业务可以使用相同类型的机器;3)客服是人,他有权利选择上班、小休,他的工作效率、质量会随着他的情绪、体验、服务的会员、工作时长等波动,调度时需要考虑他们的感受,而调度机器时无需顾忌;4)突发场景多,业务问题、系统故障等都是无规律爆发,波动特别大,很难准确的提前排好一天的人力。现场管理员是否能应对如此复杂的客服调度?答案是否定的。在没有调度系统之前,现场管理员基本靠手工来调度,随着体量越来越大,缺陷逐渐暴露:1)响应慢:比如周末线上排队时,现场管理员可能会收到电话反馈,然后再打开电脑去手工放个临时班等等,从排队发生到调度生效超过十几分钟很正常;2)不精准:缺乏数据指导,统筹优化能力弱。举个例子,A技能组排队时现场管理员想将A技能组的流量切一些到B里,切多少,分给谁,可能都是拍脑袋决定,决策结果也无法沉淀;3)手段缺:可用的手段非常少,无非就是手动排班放班、手工切个流,管控下小休、发个公告等,没有充分挖掘出客服的能力和潜力。明确了客服调度的核心问题,也知道了难点,更看到了目前的现状后,我们决定打造一款自动、智能的客服调度系统——XSigma。XSigma大图XSigma调度系统按功能模块可以分为手、脑、眼几块。手就是能提升客服资源利用率、客服服务水平以及提升客户满意度的手段,比如溢出分流、预约回拨、现场管控、激励、排班、应急放班、培训等。手段这么多,在不同业务不同场景下如何抉择是一个难点,这里需要大脑也就是调度中心来做决策。决策产生的复杂调度逻辑如何能让现场管理员、业务人员和开发人员更好地理解?我们通过可视化技术将复杂的调度逻辑转化为可以理解的实时图形界面,即调度系统的眼睛-调度大屏。手、脑、眼功能具备后,如何让他们磨合得越来越好?我们通过仿真演练系统来锤炼。下面会对图里的模块一一介绍。提前准备:排好班如果能预测好需,准备好供,那客服调度就成功了一半。在我们业务中,不同类型的客服排班模式不同。云客服采用的是自主选班模式,管理员只需设置好每个时间段的选班人数,让云客服根据自己的时间来自行选班。而SP(合作伙伴)采用的是排班模式,需要管理员根据每个时间段的话务量来安排每一个客服,既要能够保证每个时间段的接通率达到最大,又要能够协调好客服人员的休息和工作时间,保证每个客服人员的总工时大致相等,这非常考验管理员的统筹能力,当客服数目变多后,人工排班给管理员带来了巨大挑战。不管哪种模式,都需要提前预测未来两周的需要服务量(业务上按12周的粒度排班),这其实是个标准的时间序列预测问题。结合历史数据,我们可以按照部门-技能组的粒度预测出未来2周的服务量,当然,这种离线的预测只是一种近似,很难精准预测。对于合作伙伴公司客服的排班,可以抽象为多约束条件下的优化问题,在实际场景中,我们采用了组合优化算法。水平扩容:预测式应急放班提前排班很难精确预估服务量,我们不可能提前知道下周一13点25分会出现个代金券问题导致大量用户进线咨询。对于这种突发性质的流量或者比上班服务量大的流量,我们能不能像调度机器一样,快速水平扩容一批客服来上班。对于社会化的云客服,我们可以做到,比如排队数超过某值时,自动触发云客服的应急放班。通过实践发现云客服从选班到上班一般需要十多分钟时间,如何进一步节省这十多分钟的黄金处理时间?将应急放班升级为预测式应急放班!提前几分钟预测到即将到来的大流量,提前放班。这里涉及两个模型,一个是服务量实时预测模型,该模型能根据实时数据如会员的操作行为,会员在小蜜的行为,故障场景,并结合历史进线量来综合预测某一技能组未来30分钟每一分钟的进线量。有了服务量预测数据输入后,应急放班模型就可以结合当前服务会员情况,未来30分钟客服排班情况、会员消耗速度、溢出关系等综合指标,来推断出是否要触发应急放班以及放班的服务量。一旦触发应急放班后,线下通知模块会通过电话、短信等手段来通知合适的客服来上班。与调度机器不同,我们需要时刻考虑客服感受,为了避免打扰没有上班意愿的客服,我们让客服自主设置是否要接收通知。负载均衡:溢出、分流尽管预测式应急放班效果不错,但目前只针对云客服有效,对于SP类这种非选班类的客服怎么办?我们发现,线上排队时,往往是某几个技能组出现大量排队场景,比如商家线爆了,消费者线的客服可能处于空闲状态。如何解决这种忙闲不均问题?一个直观的极端想法就将所有的组变成一个大池子组,通过负载均衡分配让每一个客服都处于繁忙状态,从而达到效率最大化。而事实上并不是所有的技能组之间都能互相承接,这里既要权衡业务,又要线下培训让客服具备多技能。XSigma提供了技能组相互分流、溢出的配置功能,只要满足触发条件,就能实时分流溢出,解决了以往靠现场管理员手工改客服技能组的痛苦。对于一些场景而言,技能组间的溢出粒度有点粗,比如设置了A技能组排队可以溢出到B技能组,并不是B技能组的每一个客服都能承接A的业务,只有进行了培训的客服才能承接,XSigma同样提供了给客服打技能标签的功能。垂直扩容:弹性+1有些业务比较复杂,很难找到其他技能组进行溢出,我们将注意力转到正在上班的客服上。在线客服可以同时服务多个会员,如果一个客服最大服务能力是3,那么他最多同时服务3个会员,这个值由管理员根据客服的历史服务水平来设置。我们发现尽管很多小二的最大并发能力是相同的,在他们满负荷服务会员时,他们的服务水平有很大不同,他们的忙闲程度也有非常大的差异,为什么?小二本身水平有差异如下图所示,某技能组的客服最大服务能力都是3,最近一个月这个技能组的客服在同时服务3个会员场景下的平均响应时间分布(平均响应时间正比于客服回复速度),可以看到数据呈一个大致正太分布,说明小二服务水平有差异。场景不同举个例子,A和B两个客服最大服务能力都是5,同样都在处理5个会员,但是A的5个会员差不多都到会话结束尾声了,B的5个会员都才刚刚开始,这个例子下A和B两个客服当下的忙闲程度明显不同。既然小二的服务水平有差别,实际场景千差万别,那能不能在技能组排队时刻让那些有余力的小二突破最大服务上限?XSigma提供了两种策略来让小二突破服务上限。1)主动+1模式当技能组达到触发条件时,XSigma会主动点亮客服工作台的+1按钮(如下图红框所示),客服可以点击来主动增加一个会员进线,这种方式相当于是将扩容权利交给客服,因为只有客服自己知道目前忙不忙。2)强制+1模式如果某些技能组是强管控类型,可以选择开启强制+1模式,XSigma会结合数据自动选择一些合适的客服来突破服务能力上限,比如他之前最大服务能力是5,我们会同时让他服务6个会员。削峰填谷:预约回拨对于热线来说,小二不可能同时接好几个电话,而且业务上可承接的线下客服也少,这时候如果出现大面积排队怎么办?通过数据分析发现,很多技能组在一天内的繁忙度在波动,有高峰也有低峰,下图所示展示了某技能组的剩余服务数,可以看到有两个繁忙时间段,1013点,17~21点,这两个时间段的空闲服务数很多时候都是0,而其它时间段相对比较空闲,如果能将这些繁忙时间段的进线量腾挪到非繁忙时间段,这样就能大大提升客服的人员利用率,也能避免客户排队的烦恼。怎么做呢?通过预约回拨,将当下服务转变为未来服务。如下图所示,主要有两个模块构成。1)预约触发器。用户电话进来后,预约触发器会根据技能组的繁忙情况,来判定是否要触发预约;2)回拨触发器。采用系统主动外呼模式,一旦发现技能组繁忙度处于低峰,就会触发回拨,只要用户电话被接通,就会以高优先级进入到分配环节,从而让客服人员在有效的工作时间内都在真正的与客户通话。最优分配调度的目标是:“提升客服资源的利用率和服务水平,用更少的客服资源获得更佳的用户体验”。前面这些策略的关注点更多是在提升客服资源利用率上,有没有什么策略能提升用户的满意度?我们从分配这一环节入手。本质上我们要解决的是“会员(任务)-客服匹配优化”问题。在传统模式下,分配就是从某技能组的排队队列中找到一个等待时间最长的会员,然后再找一个该技能组下最空闲的客服完成匹配。这种公平分配方式考虑维度单一,未能在全局层面上掌握和调度分配有关的会员、客服、问题等各类信息。匹配优化问题其实是二部图匹配问题,如图所示,在某一时刻,我们可以得到某技能组下未分配的客户(任务)以及具备剩余服务能力的客服,如果能知道每个任务与每个客服之间的匹配概率,那就可以通过稳定婚姻算法找到最佳匹配。如何求得任务与客服之间的匹配概率?抽象为分类回归问题,核心在于构建大量样本(x1,x2,x3,…,xn)(y)。针对一通历史会话任务,y是客户评分或会话时长(目标可选),而x既包含了客服特征如过去30天的满意度、平均响应时间等等离线指标,以及客服当前会话的服务会员数、最大会员数等实时指标,也包含了任务的特征,如问题类型、等待时间、订单编号、重复咨询次数等等。样本有了后,下面就是选择分类算法进行训练,最终我们采用了CNN。在迭代过程中发现,模型会将流量更多分配给好的客服,而指标相对较差的客服的流量则变少,为了避免少量客服上班接不到客反弹的情景,我们将公平性的指标引入到模型中。智能培训:大黄机器人通过最优分配来提升满意度的一个重要原因是将流量更多分给了能力强水平高的客服,而这部分客服的占比不高,为什么?为了应对11、12这两个特殊月份的高流量,业务团队要招募培训大量的云客服。这些新手涌入必然会对满意度带来影响,换句话说,如果要想进一步提升满意度指标,必须提升新手客服的服务水平。对于新手,在上岗前提升他们水平的唯一方式就是培训,传统的培训都是通过线下让云客服看视频等学习资料,然后进行笔试,通过后就直接上岗,带来的问题是很多新客服对平台的工具、解决方案都不熟悉就直接服务会员,会员体感较差。对比练车场景,我们发现练车有科目1、科目2、科目3等不同流程,科目1学习理论,科目2和科目3实战模拟,如果我们引入这种实战模拟就能大大提升新客服的服务水平。我们创新的提出了使用机器人(大黄)来培训客服这一全新的客服培训模式(已申请专利)。新客服在培训租户里,通过点击大黄头像,会产生一通非常真实的模拟会话,通过和会员聊天,不断学习平台工具使用,不断提升解决客户问题能力。一旦会话结束后,大黄机器人会对这通会话进行评价,并会告知应该使用某种具体的解决方案来回答用户问题。对于新客服,目前必须完成大黄80通会话后才能上岗,整个财年培训客服几万人,服务会话量达到几百万轮次。abtest显示通过大黄试岗的客服不管在满意度、不满意、平均响应时间、平均服务时长等各项指标上都有非常明显提升。统一的调度中心从上面可以看到我们的客服调度策略多且复杂,每种策略都起到了一定提升客服资源的利用率和服务水平的作用。现在的问题来了,不同场景下这么多策略如何选择?比如现在技能组A突然排队100个会员,这个时候是直接溢出到其他技能组,还是触发主动+1或触发应急放班呢?这里需要一个大脑来做决策。如何让这个大脑适用于各种复杂的业务场景是难点。我们平台目前租户就有几十个,仅淘系这一个租户就划分了几十个客服部门,每个部门下又细分了一系列技能组,不同部门间业务场景不同。在严重缺乏历史数据积累情况下,很难直接通过训练一个决策模型来适应多种业务。于是我们的思路就转换为直接利用现场管理员的专家知识,让他们将决策逻辑沉淀为一条条的规则。目前平台上已经配置了上万条规则,每天生效的规则也有几千条,这些数据的沉淀让我们可以通过智能优化技术实现真正的智能调度决策大脑。调度监控大屏客服调度策略繁多、逻辑复杂,调度结果会切实影响整个环节参与者的感受,因此我们搭建了XSigma调度大屏,方便大家理解。在实践过程中发现调度大屏能建立起使用方对调度系统的信任感,降低开发人员和管理员发现、定位并解决系统问题的成本。举个例子,管理员在XSigma平台上设置一些规则,比如A技能组排队数>=1触发溢出到B技能组,设置完后他心里没底,他也不知道设置的逻辑是否生效,往往会让开发同学再次确定下有没有生效,而现在有了可视化调度大屏,既能观察到各个技能组的服务量、剩余服务量等实时监控数据,也能看到实时调度各种策略生效的过程,以及每天调度的实时汇总明细数据。仿真演练在调度优化场景中,如何评估调度系统的好坏至关重要。有没有一种手段能评估XSigma是否能适应各种场景?能提前证明在双11这种大促期间也能顺畅的调度?能及时发现调度过程中出现的问题?这不仅是我们也是业务同学迫切需要知道的。仔细思考发现,要解决的问题和技术的全链路压测要解决的问题很相似,我们要做的其实是业务上的全链路压测,于是我们搭建了客服调度的仿真演练系统。基于大黄机器人,我们已经能模拟会员进线,通过定制改造,机器人可以制造各种主题类型的题目,比如双十一类型场景等。在此基础上,结合业务同学的预估量,可以设置出各个技能组的进线量。在双十一之前,业务同学使用这套演练系统大规模演练过两次,由于是基于真实服务量进行演练,而不是以前的口头相传的方式,让调度上下游每一个参与的同学都有压力感。在演练过程中发现的一些问题改进后,大大提升了我们应对大促突发流量的信心。小结XSigma智能客服调度系统采用自动化配置、机器学习等技术,将复杂的调度问题分层处理,并在日益增长的会员任务基础上,不断精细化调度模型依赖的状态预估数值,不断提高调度模型的多目标规划能力,同时通过大量运用平台可视化技术,以实时、图表化的方式将系统运行状态呈现出来,最终在客服效率和用户体验时间上得到优化效果。该系统上线后,相比于往年,服务不可用时长这一业务核心指标直接下降98%。本文作者:力君阅读原文本文来自云栖社区合作伙伴“ 阿里技术”,如需转载请联系原作者。

February 21, 2019 · 1 min · jiezi

美团点评技术年货:一本覆盖各技术领域、1200+页的电子书

春节已近,年味渐浓。又到了我们献上技术年货的时候。不久前,我们已经给大家分享了技术沙龙大套餐,汇集了过去一年我们线上线下技术沙龙99位讲师,85个演讲,70+小时分享。今天出场的,同样重磅——技术博客2018年大合集。2018年,是美团技术团队官方博客第5个年头,博客网站全年独立访问用户累计超过300万,微信公众号(meituantech)的关注数也超过了15万。由衷地感谢大家一直以来对我们的鼓励和陪伴!在2019年春节到来之际,我们再次精选了114篇技术干货,制作成一本厚达1200多页的电子书呈送给大家。这本电子书主要包括前端、后台、系统、算法、测试、运维、工程师成长等7个板块。疑义相与析,大家在阅读中如果发现Bug、问题,欢迎扫描文末二维码,通过微信公众号与我们交流。也欢迎大家转给有相同兴趣的同事、朋友,一起切磋,共同成长。最后祝大家,新春快乐,阖家幸福。如何获取?长按并识别下方的二维码,关注“美团技术团队”官方公众号,回复 “年货”,即可免费在线阅读、下载2018美团点评技术文章精选。温馨提示:我们提供了电子书的下载链接,大家可以选择性下载。2018美团点评技术年货合辑:1200+页,约350M;前端系列:共566页,约90M;后台系列:共229页,约60M;系统系列:共165页,约48M;算法系列:共183页,约56M;运维系列:共140页,约36M;测试系列:共88页,约28M;工程师成长系列:共49页,约16M。备注:因文件较大,缓存需要一定的时间,需要您的一点耐心,请注意自己的流量。Android系统用户建议通过WiFi环境下载。iOS系统用户建议将地址复制到PC端,使用浏览器进行下载。

January 28, 2019 · 1 min · jiezi

美团酒旅起源数据治理平台的建设与实践

背景作为一家高度数字化和技术驱动的公司,美团非常重视数据价值的挖掘。在公司日常运行中,通过各种数据分析挖掘手段,为公司发展决策和业务开展提供数据支持。经过多年的发展,美团酒旅内部形成了一套完整的解决方案,核心由数据仓库+各种数据平台的方式实现。其中数据仓库整合各业务线的数据,消灭数据孤岛;各种数据平台拥有不同的特色和定位,例如:自助报表平台、专业数据分析平台、CRM数据平台、各业务方向绩效考核平台等,满足各类数据分析挖掘需求。早期数据仓库与各种数据平台的体系架构如图1所示:图1 酒旅早期各数据平台和数据仓库体系架构图图1所示的体系架构,在业务需求的满足上非常高效,但在长时间的使用过程中,也产生了如下一些问题:各数据平台或平台内不同模块的指标定义不一致。各数据平台或平台内不同模块指标计算口径不一致。各数据平台或平台内不同模块指标数据来源不一致。上述这些问题总结归纳起来,就是指标数据不一致的问题,最终带来的后果是指标数据可信度底,严重影响分析决策。通过后续追踪分析,上述问题的由来,主要是不同业务线的数据分析人员、数据开发人员,以及不同的产品之间,缺乏有效的沟通,也没有一个统一的入口,来记录业务的发生和加工过程。在加上人员的流动,长时间积累之后就产生了这些问题。针对这些问题,酒旅内部启动了数据治理项目,通过建设一个专业数据治理平台,实现指标维度及数据的统一管理,也探索一套高效的数据治理流程。挑战在建设起源数据治理平台的过程中,主要面临的挑战如下:起源数据治理平台应该在架构中的哪个位置切入,减少对原有系统的侵入,并实现数据治理目标。探索一套简洁高效的管理流程,实现指标维度信息统一管理,保证信息的唯一性、正确性。整合各种存储引擎,实现一套高并发、高可用的数据唯一出口。做好各业务线间的信息隔离和管理,确保数据安全。解决思路为了达成数据治理的目标,起源数据治理平台就必须记录下业务发展过程,并映射到数据加工和数据提取,规范约束这些过程。因此起源数据治理平台归纳到数据治理层,该层就位于数据仓库层(或数据集市层)之上,数据应用层之下起到桥梁的作用,而且提供一系列规则,改变原来无序交互方式,将数据仓库层和数据应用层的交互变为有序的、可查询、可监控。新的体系架构如图2所示:图2 数据治理后的新体系架构图如上图所示,在新的体系架构下:对于数据仓库层,起源数据治理平台综合业务组织形式、指标数据来源、上层产品的使用及查询的效率,指导数据仓库模型的建设;对于应用层的产品,业务元数据信息及数据信息都是由起源数据治理平台提供,保证了各数据产品获取到的信息一致,而且还简化了应用层产品数据获取成本,也降低了对原有系统的侵入。平台架构起源数据治理平台核心是保证数据一致,在数据安全的前提下,尽可能提升数据分发能力。因此平台内部有着极其复杂的关系,需要在建设过程中进行抽象,形成具有相对单一功能的模块;合理地组织模块的层级和连接关系,降低平台的开发难度,并提升平台的可维护性。平台架构如图3所示,展示了平台的内部模块组织方式。图3 起源数据治理平台架构图如上图所示起源数据治理平台在功能模块上由数据存储、数据查询、数据缓存、元数据管理、业务管理、安全管理、应用管理、对外API接口构成,各模块的功能介绍如下。数据存储起源数据治理平台管理的数据存储范围包括:数据仓库中的Topic层和数据应用层,存储方式包括:Hive、MySQL、Kylin、Palo、ES、Druid。如下图4所示:图4 起源数据治理平台管理的数据存储上图所示的这些数据存储中的数据的加工过程,由数据开发工程师负责,具体采用哪种存储介质,由数据开发工程师综合所需数据存储空间、查询效率、模型的组织形式等因素决定。但后续的使用维护都由起源数据治理平台管理,管理方式是通过管理这些数据表的元数据信息和查询实现,具体实现细节会在下面章节中详解。数据存储托管之后,数据表元数据信息变更监控、表数据生产(存储空间、生产状态及完成时间)监控、表数据波动(同环比等)监控以及表的使用(模型的构建及查询效率等)监控及评估,都由起源数据治理平台自动完成,所有信息的变动都会自动周知对应的负责人,保证数据应用的安全和稳定。元数据管理元数据信息宏观上包括两大部分:业务元数据信息和数据元数据信息。其中业务元数据信息包括:指标业务定义、维度的业务定义等;数据元数据信息包括:数据表元数据信息、模型元数据信息、维表与维度的绑定关系、数据模型字段与指标的绑定关系。起源平台为了实现元数据信息的管理,设计了四个模块实现,分别是:数据表管理模块、模型管理模块、指标管理模块、维度管理模块。元数据管理是起源数据治理平台的核心,起源平台就是通过控制好元数据,来驱动数据的生产和消费。数据表管理模块数据表管理模块管理了数据库信息和数据表信息。其中数据库信息包括数据库链接信息,数据库信息维护后,起源数据治理平台自动获取对应库中表的元数据信息。数据表信息包括:表的元数据信息(引擎、字段等)、表类型(维表或事实表)、表的使用情况(是否被模型使用)、表对应的ETL、表的负责人、表的推荐度、描述信息、表的监控配置及报警历史、以及样例数据等。上述这些信息为业务用户提供指导,为模型管理提供数据支持,为数据表和数据的稳定提供监控和预警。模型管理模块模型管理模块能够还原业务落地后数据表的组织关系,包括:数据表的关联方式(join、left join、semi join等)、数据表的关联限制、模型ER图、模型包含字段、模型字段与维度的绑定关系、模型与指标的绑定关系。不过在实际使用过程中,面向业务和面向分析的模型有所不同,起源数据治理平台是面向分析的,所以主要的模型包括维度建模中的星型模型或雪花模型,再就是OLAP多维分析的MOLAP或ROLAP。模型管理如下图5、图6所示:图5 起源数据治理平台数据表模型图6 起源数据治理平台SQL模型维度管理模块维度管理模块包括基础信息和技术信息,对应着不同人员维护。其中基础信息对应维度的业务信息,由业务管理人员维护,包括维度名称、业务定义、业务分类。技术信息对应维度的数据信息,由数据开发工程师维护,包括是否有维表(是枚举维度还是有独立的维表)、是否是日期维、对应code英文名称和中文名称、对应name英文名称和中文名称。如果维度有维表,则需要和对应的维度表绑定,设置code和name对应的字段;如果维度是枚举维,则需要填写对应的code和name。维度的统一管理,有利于以后数据表的标准化,也方便用户的查看。指标管理模块指标管理模块核心包括基础信息和技术信息管理,衍生信息包括关联指标、关联应用管理。基础信息对应的就是指标的业务信息,由业务人员填写,主要包括指标名称、业务分类、统计频率、精度、单位、指标类型、指标定义、计算逻辑、分析方法、影响因素、分析维度等信息;基础信息中还有一个比较重要的部分是监控配置,主要是配置指标的有效波动范围区间、同环比波动区间等,监控指标数据的正常运行。技术信息构成比较复杂,包括数据类型、指标代码,但是核心部分是指标与模型的绑定关系,通过使用演进形成了当前系统两类绑定关系:绑定物理模型和构建虚拟模型。绑定物理模型是指标与模型管理中的物理模型字段绑定,并配置对应的计算公式,或还包含一些额外的高级配置,如二次计算、模型过滤条件等;创建虚拟模型是通过已有指标和其对应的物理模型,具体步骤首先配置已有指标的计算方式或指标维度的过滤,然后选择指标已绑定的物理模型,形成一个虚拟模型,虚拟模型的分析维度就是所选指标基础模型的公共维度。衍生信息中的关联指标、关联应用管理,是为了方便观察指标被那些其他指标和数据应用使用,这是因为指标技术信息采用了严格权限控制,一旦被使用为了保证线上的运行安全是禁止变更的,只有解绑并审核通过后才可以编辑,所以这些衍生信息就是方便管理人员使用。指标技术信息如图7所示:图7 起源数据治理平台指标技术信息业务管理业务管理按照功能划分为业务线管理、主题管理和工单管理三部分,在系统的实际建设中是拆分为业务主题管理、数据主题管理和工单管理三大模块实现的。相关模块的建设主要保证业务人员和数据人员业务主题建设,相关模块的权限控制,业务流程审核,对应资源的隔离以及业务资源加工申请和加工过程的记录追踪。具体实现和功能如下:业务主题管理实现业务业务线管理和业务主题管理,实现不同业务线的管理以及业务线下的业务主题管理。业务线的拆分还隐藏着其他模块的权限管控和资源隔离的功能,不同业务线的用户只能看到有权业务线的指标和维度;而且业务线的用户划分为普通用户和管理员,分别查看或编辑维度和指标的业务信息。而且业务线和业务主题中分别维护的商分负责人对指标进行二级审核,因为新创建的指标仅仅是普通指标,如果想要全网都能查看,则需要发起认证,由这些人员审核。数据主题管理数据主题管理实现数据业务线和数据主题管理,实现不同数据线的管理以及数据线下的数据主题管理。数据线的拆分也隐藏着对数据表、模型、指标、维度的资源隔离和权限管控的功能,不同数据线的用户只能查看有权数据线的资源;而且数据线的用户分为普通用户和管理员,对有权资源进行查看或编辑。数据线的接口人在工单模块中具有审核工单的权限功能。数据主题的负责人拥有审核模型和指标技术信息的权限功能。工单模块管理工单模块管理实现了指标维度和对应模型加工线上申请、审核、加工、审批的流程。整个模块也是围绕着这四个流程实现的,具体是业务人员发起指标和维度集合的加工申请,然后由数据线接口人审核工单的合理性并分配对应的数据开发工程师,数据开发工程师加工模型并与对应的维度指标绑定,然后在工单中提交由数据接口人审核是否合理,最终由工单发起人验收。这个流程是一个标准的工单流程,每个节点的业务流程可能会反复,但是每次操作都进行记录,方便业务人员后期追踪。工单管理如下图8所示:图8 起源数据治理平台工单管理安全管理安全管理是起源数据治理平台核心功能之一,分为平台操作权限管理和接口调用权限管理两大部分。其中平台操作权限管理是通过与公司将军令权限管理系统打通,并配合平台其他模块中权限控制代码,实现了权限管理、审批、审计三大功能模块;接口权限管理是通过平台内的数据应用管理和外部应用管理模块的映射关系,并在接口调用时鉴权实现,这部分会在下面的应用管理章节中介绍。权限管理模块权限管理模块是将平台的资源分划分为页面权限、业务线&数据线用户权限、数据应用权限来实现的。页面权限实现平台内页面访问控制。业务线&数据线用户权限是将用户分类为普通用户和管理员,普通用户只能查看业务线和数据线内资源,管理员可以操作业务线和数据线内的资源;并且通过业务线和数据线的独立管理实现资源隔离,业务线实现了所属维度和指标的隔离;数据线实现了所属数据表和模型的隔离,并且通过建立业务线和数据线的关联关系,也保证了指标和维度的技术信息操作隔离。数据应用中每个应用都是独立管理的,每个应用权限都拆分普通用户和管理员,普通用户可以访问查询应用,管理员可以操作应用。审批模块审批模块包含审批工作流、我的申请、我的审批构成。审批工作流是根据不同的应用场景实现不同层级的审批,例如:在指标管理中服务于个人的普通指标变更为服务于整个业务线的认证指标,就需要发起两级审批,由业务主题负责人和业务商分审核通过才可以;模型管理中新增或修改模型上线,都需要数据主题负责人审批;数据应用的变更,都需要下游所有依赖外部应用负责人审批才生效。我的申请和我的审批是平台页面方便用户查看流程进度和操作审核。审批模块目标是保证发布信息的正确性、系统服务的稳定性。审计模块审计模块包括用户操作记录和记录查看追踪。用户操作记录是平台各模块调用接口记录用户每次操作前后的数据变更;记录查看追踪是检索查询页面,查看对应的变更。审计模块保证了用户操作追踪追责,也保证误操作的信息恢复。应用管理应用管理由数据应用、外部应用、数据地图三大模块组成,它们构成了对外服务的主体,记录了外部应用与平台内管理的指标、维度、模型和表的关联关系,也提供数据查询展示、应用层ETL生产的能力。而且数据开发人员从底层向上观察,可以追踪数据最终的所有流向;业务分析人员从顶层向下观察,可以看到构成服务的所有数据来源。数据应用模块数据应用模块是记录生成每个服务所需的指标、维度和数据模型的关系。每次服务中可以包含多个指标,这些指标可以来源于多个数据模型,不过不同的数据模型中需要包含公共维度,因为是通过这些公共维度将不同模型关联起来。数据应用中构建的服务可以发布成查询服务、应用层ETL生产服务、对外API数据接口服务、通用报表配置服务,来满足业务的不同需求。数据应用管理如下图9所示:图9 起源数据治理平台数据应用外部应用模块外部应用模块管理外部应用和应用内的模块,以及这些模块订阅的对应数据应用,目标是实现API接口调用的权限管理和数据最终流向的记录。具体的实现上模块首先创建对应的外部应用,记录外部应用的名称、URL、APPKEY等信息,然后由对应应用的负责人创建模块,记录模块名称、URL、moduleKey等信息。这些信息完善后,由对应的数据应用赋权给对应的模块,建立起数据应用与外部应用的联系。最后在外部应用调用平台对外API接口时,进行权限管理。数据地图数据地图功能是追查数据的流向,可以从数据表、模型、指标、数据应用、外部应用任意节点查看上游数据来源和下游数据去向。起源数据治理平台核心功能也是组织这些节点间的关系,形成完整的服务,数据地图就是通过上面介绍模块记录的关系,追踪数据流向,方便数据开发人员和业务分析人员了解数据消费和数据来源。数据地图如下图10所示:图10 起源数据治理平台数据地图对外API对外API接口是一套完整的对外信息提供接口,提供的功能分为元数据信息类的接口、数据类接口、监控统计类接口,分别满足外部平台和分析人员的对应需求。外部系统通过起源数据治理平台获取到的元数据和数据是经过认证并由平台自动校验后的,可以保证信息的一致性、正确性。元数据信息接口元数据信息接口提供的包括指标、维度业务元数据信息和数据表、模型、指标计算、维度维表相关的数据元数据信息,实现与上游系统信息共享,达到信息一致性的目标。数据类接口数据类接口提供指标维度数据查询服务,不单单满足常见的单条SQL查询,而且可以实现多次查询聚合运算(例如:同环比等)以及跨引擎查询,并通过并发处理,可以有效提升查询效率,满足更多的业务场景。接口具有监控功能,能够评估每次查询效率,提供查询指导或预警的能力。监控统计类接口监控统计类接口提供指标数据监控信息、指标维度使用统计、数据接口的调用效率统计等服务,帮助下游服务平台了解服务质量。内部工作原理起源数据治理平台内部工作原理就是实现指标、维度业务信息与数据模型计算关系的映射管理,并根据外部应用所需的指标、维度以及查询条件选择最优的模型动态的实现查询SQL或查询Query的拼接,然后通过分布式查询引擎实现数据的高效查询,具体过程如下图11所示:图11 起源数据治理平台内部工作原理上图所示的分布式查询引擎,整合了大数据分析常见的各种存储,通过封装的接口提供服务。而且分布式是通过Akka Cluster自主实现,通过Cluster Singleton解决单点故障的问题,通过Redis实现了任务队列的持久化,通过平衡子节点任务量实现任务的合理调度,通过查询状态监控自动实现查询降级和任务队列的拆解,并且也完善了整个调度的监控,可以实时查看任务和节点的运行情况。管理流程起源数据治理平台生产所需参与的角色包括:业务人员和数据开发人员(RD)。为了保证信息的正确性,平台内有着严格的管理流程,需要不同的角色在对应的节点进行维护管理,平台的管理流程如下图12所示:图12 起源数据治理平台管理流程所上图所示,指标的业务信息需要业务人员首先进行维护,然后数据RD同学进行相应的数据表的建设,维护对应的数据表和模型的元数据信息,并完成指标与模型的绑定,最后由数据RD同学构建数据应用为用户、业务系统及数据产品等提供服务。建设成果经过长时间的探索开发,完成了起源数据治理平台的建设,成功的解决了上面提到的问题,并且已经完成了酒旅内部10+个数据平台(包括定制化产品和通用报表服务平台)的数据治理支持。起源数据治理平台还带来了一些额外的收获,总结归纳起来实现了3个目标,提供了4种能力,如下:统一指标管理的目标。保证指标定义、计算口径、数据来源的一致性。统一维度管理的目标。保证维度定义、维度值的一致性。统一数据出口的目标。实现了维度和指标元数据信息的唯一出口,维值和指标数据的唯一出口。提供维度和指标数据统一监控及预警能力。提供灵活可配的数据查询分析能力。提标数据地图展示表、模型、指标、应用上下游关系及分布的能力。提供血缘分析追查数据来源的能力。如果换位到指标的角色,以辩证的角度分析,起源数据治理平台解决了一个终极哲学问题:我是谁,我从哪里来,我到哪里去。未来展望起源数据治理平台是天工体系(从数据管理、查询到展示的一个完整生态)的一部分,整个天工体系还包括如意通用报表系统、筋斗云数据查询系统。通过对天工体系的建设,直接目标是为业务提供一整套高效、高质量的数据服务平台;但是在天工体系的建设中,进行微服务治理,抽象形出一套统一标准,吸纳更多的业务参与建设,为业务提供开发降级,避免服务的重复建设,提升服务建设速度。如下图13所示:图13 天工体系架构图如上图所示,天工体系开放三套交互标准,实现模块的可插拔和自由扩展,分别是:元数据交互标准,实现元数据管理的可插拔。数据查询标准,实现数据查询引擎的可插拔。可视化组件数据交互标准,实现可视化组件的可插拔。作者简介夷山,美团点评技术专家,现任TechClub-Java俱乐部主席,2006年毕业于武汉大学,先后就职于IBM、用友、风行以及阿里巴巴。2014年加入美团,长期致力于BI工具、数据安全与数据质量工作等方向。李鹏,美团点评技术专家,曾就职于搜狐畅游、网易,2018年加入美团点评,长期致力于数据治理、数据仓库建设、数据平台研发等工作方向。招聘最后插播一个招聘广告,有对数据产品工具开发感兴趣的可以发邮件给 fuyishan#meituan.com。我们是一群擅长大数据领域数据工具,数据治理,智能数据应用架构设计及产品研发的工程师。

December 28, 2018 · 1 min · jiezi

美团DB数据同步到数据仓库的架构与实践

背景在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据。在互联网企业中,常见的ODS数据有业务日志数据(Log)和业务DB数据(DB)两类。对于业务DB数据来说,从MySQL等关系型数据库的业务数据进行采集,然后导入到Hive中,是进行数据仓库生产的重要环节。如何准确、高效地把MySQL数据同步到Hive中?一般常用的解决方案是批量取数并Load:直连MySQL去Select表中的数据,然后存到本地文件作为中间存储,最后把文件Load到Hive表中。这种方案的优点是实现简单,但是随着业务的发展,缺点也逐渐暴露出来:性能瓶颈:随着业务规模的增长,Select From MySQL -> Save to Localfile -> Load to Hive这种数据流花费的时间越来越长,无法满足下游数仓生产的时间要求。直接从MySQL中Select大量数据,对MySQL的影响非常大,容易造成慢查询,影响业务线上的正常服务。由于Hive本身的语法不支持更新、删除等SQL原语,对于MySQL中发生Update/Delete的数据无法很好地进行支持。为了彻底解决这些问题,我们逐步转向CDC (Change Data Capture) + Merge的技术方案,即实时Binlog采集 + 离线处理Binlog还原业务数据这样一套解决方案。Binlog是MySQL的二进制日志,记录了MySQL中发生的所有数据变更,MySQL集群自身的主从同步就是基于Binlog做的。本文主要从Binlog实时采集和离线处理Binlog还原业务数据两个方面,来介绍如何实现DB数据准确、高效地进入数仓。整体架构整体的架构如上图所示。在Binlog实时采集方面,我们采用了阿里巴巴的开源项目Canal,负责从MySQL实时拉取Binlog并完成适当解析。Binlog采集后会暂存到Kafka上供下游消费。整体实时采集部分如图中红色箭头所示。离线处理Binlog的部分,如图中黑色箭头所示,通过下面的步骤在Hive上还原一张MySQL表:采用Linkedin的开源项目Camus,负责每小时把Kafka上的Binlog数据拉取到Hive上。对每张ODS表,首先需要一次性制作快照(Snapshot),把MySQL里的存量数据读取到Hive上,这一过程底层采用直连MySQL去Select数据的方式。对每张ODS表,每天基于存量数据和当天增量产生的Binlog做Merge,从而还原出业务数据。我们回过头来看看,背景中介绍的批量取数并Load方案遇到的各种问题,为什么用这种方案能解决上面的问题呢?首先,Binlog是流式产生的,通过对Binlog的实时采集,把部分数据处理需求由每天一次的批处理分摊到实时流上。无论从性能上还是对MySQL的访问压力上,都会有明显地改善。第二,Binlog本身记录了数据变更的类型(Insert/Update/Delete),通过一些语义方面的处理,完全能够做到精准的数据还原。Binlog实时采集对Binlog的实时采集包含两个主要模块:一是CanalManager,主要负责采集任务的分配、监控报警、元数据管理以及和外部依赖系统的对接;二是真正执行采集任务的Canal和CanalClient。当用户提交某个DB的Binlog采集请求时,CanalManager首先会调用DBA平台的相关接口,获取这一DB所在MySQL实例的相关信息,目的是从中选出最适合Binlog采集的机器。然后把采集实例(Canal Instance)分发到合适的Canal服务器上,即CanalServer上。在选择具体的CanalServer时,CanalManager会考虑负载均衡、跨机房传输等因素,优先选择负载较低且同地域传输的机器。CanalServer收到采集请求后,会在ZooKeeper上对收集信息进行注册。注册的内容包括:以Instance名称命名的永久节点。在该永久节点下注册以自身ip:port命名的临时节点。这样做的目的有两个:高可用:CanalManager对Instance进行分发时,会选择两台CanalServer,一台是Running节点,另一台作为Standby节点。Standby节点会对该Instance进行监听,当Running节点出现故障后,临时节点消失,然后Standby节点进行抢占。这样就达到了容灾的目的。与CanalClient交互:CanalClient检测到自己负责的Instance所在的Running CanalServer后,便会进行连接,从而接收到CanalServer发来的Binlog数据。对Binlog的订阅以MySQL的DB为粒度,一个DB的Binlog对应了一个Kafka Topic。底层实现时,一个MySQL实例下所有订阅的DB,都由同一个Canal Instance进行处理。这是因为Binlog的产生是以MySQL实例为粒度的。CanalServer会抛弃掉未订阅的Binlog数据,然后CanalClient将接收到的Binlog按DB粒度分发到Kafka上。离线还原MySQL数据完成Binlog采集后,下一步就是利用Binlog来还原业务数据。首先要解决的第一个问题是把Binlog从Kafka同步到Hive上。Kafka2Hive整个Kafka2Hive任务的管理,在美团数据平台的ETL框架下进行,包括任务原语的表达和调度机制等,都同其他ETL类似。而底层采用LinkedIn的开源项目Camus,并进行了有针对性的二次开发,来完成真正的Kafka2Hive数据传输工作。对Camus的二次开发Kafka上存储的Binlog未带Schema,而Hive表必须有Schema,并且其分区、字段等的设计,都要便于下游的高效消费。对Camus做的第一个改造,便是将Kafka上的Binlog解析成符合目标Schema的格式。对Camus做的第二个改造,由美团的ETL框架所决定。在我们的任务调度系统中,目前只对同调度队列的任务做上下游依赖关系的解析,跨调度队列是不能建立依赖关系的。而在MySQL2Hive的整个流程中,Kafka2Hive的任务需要每小时执行一次(小时队列),Merge任务每天执行一次(天队列)。而Merge任务的启动必须要严格依赖小时Kafka2Hive任务的完成。为了解决这一问题,我们引入了Checkdone任务。Checkdone任务是天任务,主要负责检测前一天的Kafka2Hive是否成功完成。如果成功完成了,则Checkdone任务执行成功,这样下游的Merge任务就可以正确启动了。Checkdone的检测逻辑Checkdone是怎样检测的呢?每个Kafka2Hive任务成功完成数据传输后,由Camus负责在相应的HDFS目录下记录该任务的启动时间。Checkdone会扫描前一天的所有时间戳,如果最大的时间戳已经超过了0点,就说明前一天的Kafka2Hive任务都成功完成了,这样Checkdone就完成了检测。此外,由于Camus本身只是完成了读Kafka然后写HDFS文件的过程,还必须完成对Hive分区的加载才能使下游查询到。因此,整个Kafka2Hive任务的最后一步是加载Hive分区。这样,整个任务才算成功执行。每个Kafka2Hive任务负责读取一个特定的Topic,把Binlog数据写入original_binlog库下的一张表中,即前面图中的original_binlog.db,其中存储的是对应到一个MySQL DB的全部Binlog。上图说明了一个Kafka2Hive完成后,文件在HDFS上的目录结构。假如一个MySQL DB叫做user,对应的Binlog存储在original_binlog.user表中。ready目录中,按天存储了当天所有成功执行的Kafka2Hive任务的启动时间,供Checkdone使用。每张表的Binlog,被组织到一个分区中,例如userinfo表的Binlog,存储在table_name=userinfo这一分区中。每个table_name一级分区下,按dt组织二级分区。图中的xxx.lzo和xxx.lzo.index文件,存储的是经过lzo压缩的Binlog数据。MergeBinlog成功入仓后,下一步要做的就是基于Binlog对MySQL数据进行还原。Merge流程做了两件事,首先把当天生成的Binlog数据存放到Delta表中,然后和已有的存量数据做一个基于主键的Merge。Delta表中的数据是当天的最新数据,当一条数据在一天内发生多次变更时,Delta表中只存储最后一次变更后的数据。把Delta数据和存量数据进行Merge的过程中,需要有唯一键来判定是否是同一条数据。如果同一条数据既出现在存量表中,又出现在Delta表中,说明这一条数据发生了更新,则选取Delta表的数据作为最终结果;否则说明没有发生任何变动,保留原来存量表中的数据作为最终结果。Merge的结果数据会Insert Overwrite到原表中,即图中的origindb.table。Merge流程举例下面用一个例子来具体说明Merge的流程。数据表共id、value两列,其中id是主键。在提取Delta数据时,对同一条数据的多次更新,只选择最后更新的一条。所以对id=1的数据,Delta表中记录最后一条更新后的值value=120。Delta数据和存量数据做Merge后,最终结果中,新插入一条数据(id=4),两条数据发生了更新(id=1和id=2),一条数据未变(id=3)。默认情况下,我们采用MySQL表的主键作为这一判重的唯一键,业务也可以根据实际情况配置不同于MySQL的唯一键。上面介绍了基于Binlog的数据采集和ODS数据还原的整体架构。下面主要从两个方面介绍我们解决的实际业务问题。实践一:分库分表的支持随着业务规模的扩大,MySQL的分库分表情况越来越多,很多业务的分表数目都在几千个这样的量级。而一般数据开发同学需要把这些数据聚合到一起进行分析。如果对每个分表都进行手动同步,再在Hive上进行聚合,这个成本很难被我们接受。因此,我们需要在ODS层就完成分表的聚合。首先,在Binlog实时采集时,我们支持把不同DB的Binlog写入到同一个Kafka Topic。用户可以在申请Binlog采集时,同时勾选同一个业务逻辑下的多个物理DB。通过在Binlog采集层的汇集,所有分库的Binlog会写入到同一张Hive表中,这样下游在进行Merge时,依然只需要读取一张Hive表。第二,Merge任务的配置支持正则匹配。通过配置符合业务分表命名规则的正则表达式,Merge任务就能了解自己需要聚合哪些MySQL表的Binlog,从而选取相应分区的数据来执行。这样通过两个层面的工作,就完成了分库分表在ODS层的合并。这里面有一个技术上的优化,在进行Kafka2Hive时,我们按业务分表规则对表名进行了处理,把物理表名转换成了逻辑表名。例如userinfo123这张表名会被转换为userinfo,其Binlog数据存储在original_binlog.user表的table_name=userinfo分区中。这样做的目的是防止过多的HDFS小文件和Hive分区造成的底层压力。实践二:删除事件的支持Delete操作在MySQL中非常常见,由于Hive不支持Delete,如果想把MySQL中删除的数据在Hive中删掉,需要采用“迂回”的方式进行。对需要处理Delete事件的Merge流程,采用如下两个步骤:首先,提取出发生了Delete事件的数据,由于Binlog本身记录了事件类型,这一步很容易做到。将存量数据(表A)与被删掉的数据(表B)在主键上做左外连接(Left outer join),如果能够全部join到双方的数据,说明该条数据被删掉了。因此,选择结果中表B对应的记录为NULL的数据,即是应当被保留的数据。然后,对上面得到的被保留下来的数据,按照前面描述的流程做常规的Merge。总结与展望作为数据仓库生产的基础,美团数据平台提供的基于Binlog的MySQL2Hive服务,基本覆盖了美团内部的各个业务线,目前已经能够满足绝大部分业务的数据同步需求,实现DB数据准确、高效地入仓。在后面的发展中,我们会集中解决CanalManager的单点问题,并构建跨机房容灾的架构,从而更加稳定地支撑业务的发展。本文主要从Binlog流式采集和基于Binlog的ODS数据还原两方面,介绍了这一服务的架构,并介绍了我们在实践中遇到的一些典型问题和解决方案。希望能够给其他开发者一些参考价值,同时也欢迎大家和我们一起交流。招聘如果你对我们的工作内容比较感兴趣,欢迎发送简历给 wangmengmeng05@meituan.com,和我们一起致力于解决海量数据采集和传输的问题中来吧!

December 7, 2018 · 1 min · jiezi

始于阿里,回归社区:阿里8个项目进入CNCF云原生全景图

摘要: 一群技术理想主义者,与太平洋另一边的技术高手们正面PK,在这场躲不开的战役中,一起认真一把。破土而出的生命力,源自理想主义者心底对技术的信念。云原生技术正席卷全球,云原生基金会在去年KubeCon +CloudNativeCon NA的现场宣布:其正在孵化的项目已达14个,入驻的厂家或产品已超过300家,并吸引了2.2万开发者参与项目代码贡献,其明星产品Kubenetes 的GitHub 上Authors 和 Issues 量已排行开源领域的第二名。今年,KubeCon + CloudNativeCon 首次来到中国。在2018 KubeCon + CloudNativeCon的现场,阿里云研究员伯瑜向在场的开发者们宣布,CNCF已将阿里巴巴云原生镜像分发系统Dragonfly接纳为其沙箱项目(Sandbox),并有机会成为国内首个从CNCF毕业的开源项目。目前已经毕业的两个项目,一个是Kubernetes,另一个是Prometheus。据悉,目前阿里巴巴已经有8个项目进入CNCF云原生全景图,分别是分布式服务治理框架Dubbo、分布式消息引擎RocketMQ、流量控制组件Sentinel、企业级富容器技术PouchContainer、服务发现和管理Nacos、分布式消息标准OpenMessaging、云原生镜像分发系统Dragonfly和高可用服务AHAS。时间回到2016年2016年的那届双11,RocketMQ创始人冯嘉和他的团队首次将低延迟存储解决方案应用于双11的支撑,经受住了流量的大考,整个大促期间,99.996%的延迟落在了10ms以内,完成了保障交易稳定的既定目标。对于读写比例几乎均衡的分布式消息引擎来说,这一技术上的突破,即便是放在全球范围内,也绝对是值得称赞的。另一边,在历时3个月的开源重塑后,冯嘉和他的团队启动了RocketMQ向Apache 软件基金会的捐赠之路,但迈出这一步并不容易。“当时国内的开源氛围还没有现在那么活跃,开源之后,很多设计、源码和文档的维护工作还不够理想,但我们就是想证明国内的开源项目和开源社区也可以在世界的开源舞台上发挥价值。”经过近一年的努力,在2017年9月25日,Apache 软件基金会官方宣布,阿里巴巴捐赠给 Apache 社区的开源项目 RocketMQ 从 Apache 社区正式毕业,成为 Apache 顶级项目(TLP),这是国内首个非 Hadoop 生态体系的Apache 社区顶级项目。值得一提的是,根据项目毕业前的统计,RocketMQ有百分八十的新特性与生态集成来自于社区的贡献。2017年,消息领域出现一件里程碑事件分布式消息领域的国际标准OpenMessaging开源项目正式入驻Linux基金会,这是国内首个在全球范围发起的分布式计算领域的国际标准。消息通讯已经成为现代数据驱动架构的关键环节,但在全球范围内,消息领域仍然存在两大问题:一是缺乏供应商中立的行业标准,导致各种消息中间件的高复杂性和不兼容性,相应地造成了公司的产品低效、混乱和供应商锁定等问题。二是目前已有的方案框架并不能很好地适配云架构,即非云原生架构,因此无法有效地对大数据、流计算和物联网等新兴业务需求提供技术支持。这也是冯嘉和他的团队在开源RocketMQ过程中,开发者和合作伙伴经常会提到的问题:“在消息领域,市场上出现了各类不同的开源解决方案,这导致了用户更高的接入和维护成本,为了确保各个消息引擎间能正常通信,还要投入大量的精力去做兼容。”这时候,建立一套供应商中立,和语言无关的消息领域的事实标准,成为各社区成员共同的诉求。此后,在2017年9月,阿里巴巴发起OpenMessaging项目,并邀请了雅虎、滴滴出行、Streamlio共同参与,一年后,参与OpenMessaging开源标准社区的企业达10家之多,包括阿里巴巴、Datapipeline、滴滴出行、浩鲸科技、京东商城、青云QingCloud、Streamlio、微众银行、Yahoo、中国移动苏州研发中心(按首字母排序),此外,还获得了RocketMQ、RabbitMQ和Pulsar 3个顶级消息开源厂商的支持。相比于开源一个分布式消息项目,一套开源标准能被各家厂商所接受,对整个国内开源领域而言,是更具有里程碑意义的事件。2017年9月,Dubbo重启开源Dubbo 是阿里巴巴于2012年开源的分布式服务治理框架,是国内影响力最大、使用最广泛的开源服务框架之一,在2016年、2017年开源中国发起的最受欢迎的中国开源软件评选中,连续两年进入Top10名单。2017年9月7日,在Github将版本更新至2.5.4,重点升级所依赖的JDK及其组件,随后连续发布了11个版本。并于2018年2月捐献给 Apache 软件基金会,希望借助社区的力量来发展 Dubbo,打消大家对于 Dubbo 未来的顾虑。项目重启半年后,Dubbo 项目负责人阿里巴巴高级技术专家北纬在接受媒体采访的时候,从战略、社区、生态和回馈四个方面谈了Dubbo重启开源背后的原因。“集团近几年开始将开源提到了新的战略高度,这次投入资源重启开源,核心是希望让开源发挥更大的社会价值,并和广大开发者一起,建立一个繁荣的Dubbo生态,普惠所有使用 Dubbo 的人和Dubbo本身。”Dubbo项目组成员朱勇在今年上海的技术沙龙上分享Dubbo未来发展的过程中提到,其后续的规划是要解决好两个问题。第一个问题是重点关注技术趋势,例如云原生对Dubbo开源现状的影响。第二个问题是 Dubbo 本身定位的问题,除了保持技术上的领先性,还需要围绕 Dubbo 核心发展生态,和社区成员一起将 Dubbo 发展成一个服务化改造的整体解决方案。2017年11月,阿里自研容器技术PouchContainer开源在开源不到一年的时间里,PouchContainer 1.0 GA 版本发布,达到可生产级别。今年8月,PouchContainer 被纳入开源社区开放容器计划OCI;9月,被收录进高校教材《云计算导论》;11月,Pouch团队携蚂蚁金服容器团队、阿里云ACS团队,与容器生态 Containerd社区 Maintainer进行技术交流,有望发展成 Containerd 社区 Maintainer 席位,代表国内企业在世界容器技术领域发声。PouchContainer发展速度之快,超出了宏亮的想象。宏亮是 Docker Swarm 容器集群项目的核心代码维护者(Maintainer),并于2015年8月出版了《Docker 源码分析》一书,对 Docker 架构和源代码进行了深入的讲解,该书在Docker领域迅速成为畅销书籍。2017年,宏亮承担起阿里自有容器技术的对内支持和对外推广工作,秉承初心,希望在竞争激烈的容器开源领域能抢下属于国内容器技术的一席之地。在他和团队的努力下,阿里集团内部已实现100%的容器化,并已经开始涉及离线业务,实现在、离线业务的混合调度与部署。整个集团能实现100%的容器化,离不开阿里内部自研的P2P分发技术,该项目取名为蜻蜓 Dragonfly,寓意点与点之间的文件分发能如蜻蜓般轻盈和迅速,解决传统文件发布系统中的大规模下载、远距离传输、带宽成本和安全传输的问题。日前,Dragonfly 正式进入 CNCF, 并成为国内第三个被列为沙箱级别(Sandbox Level Project)的开源项目,可见,CNCF 在其云原生的技术版图中正希望借助蜻蜓等优秀的镜像分发技术,以提升企业微服务架构下应用的交付效率。始于阿里,回归社区。今年夏天,国内开源领域,迎来了两位新成员。作为微服务和云原生生态下的两款重要开源框架/组件,Nacos主打云原生应用中的动态服务发现、配置和服务管理,Sentinle则是聚焦在限流和降级两个方面。Nacos和Sentinel均是在阿里近10年的核心业务场景下沉淀所产生的,他们的开源是对微服务和元原生领域开源技术方案的有效补充,同时也非常强调融入开源生态,除了兼容Dubbo和Sentinel,也支持对Spring Cloud 和 Kubenetes等生态,以增强自身的生命力。“阿里巴巴早在 2007 年进行从 IOE 集中式应用架构升级为互联网分布式服务化架构的时候,就意识到在分布式环境中,诸如分布式服务治理,数据源容灾切换、异地多活、预案和限流规则等场景下的配置变更难题,因为在一个大型的分布式系统中,你没有办法把整个分布式系统停下来,去做一个软件、硬件或者系统的升级。”阿里巴巴高级技术专家坤宇在2017 QCon的现场分享到。在配置变更领域,我们从2008年的无 ConfigServer 时代,借用硬件负载设备F5提供的VIP功能,通过域名方式来实现服务提供方和调用方之间的通信,逐步经历了ConfigServer单机版、集群版的多次迭代,不断提高其稳定性。曾写下支付宝钱包服务端第一行代码的阿里高级技术专家慕义,在今年深圳的技术沙龙现场回忆了阿里注册中心自研的10年路:“这期间,集团业务经历了跨越式的发展,每年翻番的服务规模,不断的给ConfigServer的技术架构演进带来更高的要求和挑战,使得我们有更多的机会在生产环境发现和解决一个个问题的过程中,实现架构的一代代升级。Nacos便是在这样的背景下,经过几代技术人的技术攻坚所产生的。”我们希望Nacos可以帮助开发者获得有别于原生或其他第三方服务发现和动态配置管理解决方案所提供的能力,满足开发者们在微服务落地过程当中对工业级注册中心的诉求,缩短想法到实现的路径。巧的是,一边是 Nacos宣布开源,另一边是Spring Cloud生态下的服务注册和发现组件Netflix Eureka宣布闭源,勇敢者的游戏充满了变数,但在坤宇和他的团队看来,这场游戏自己可以走到最后,因为我们并不是一个人在战斗,Nacos只是阿里众多开源项目中的一员,随后还会有更多的开源项目反哺给社区,形成生态,例如轻量级限流降级组件 Sentinel。7月29日,Aliware Open Source•深圳站现场,只能容纳400人的场地,来了700多位开发者。阿里巴巴高级技术专家子矜在现场宣布了轻量级限流降级组件Sentinel的开源。作为阿里巴巴“大中台、小前台”架构中的基础模块,Sentinel经历了10年双11的考验覆盖了阿里的所有核心场景,也因此积累了大量的流量归整场景以及生产实践。Sentinel的出现,离不开阿里历届高可用架构团队的共同努力。“在双11备战中,容量规划是最重要也是最具挑战的环节之一。从第一年开始,双11的0点时刻就代表了我们的历史最高业务访问量,它通常是日常流量的几十倍甚至上百倍。因此,如何让一个技术和业务持续复杂的分布式站点去更平稳支撑好这突如其来的流量冲击,是我们这10年来一直在解的题。”阿里巴巴高可用架构团队资深技术专家游骥在今年的双11结束后分享道。这10年,容量规划经历了人工估算、线下压测、线上压测、全链路压测、全链路压测和隔离环境、弹性伸缩相结合的5个阶段。2013年双11结束后,全链路压测的诞生解决了容量的确定性问题。作为一项划时代的技术,全链路压测的实现,对整个集团而言,都是一件里程碑事件。随后,基于全链路压测为核心,打造了一系列容量规划相关的配套生态,提升能力的同时,降低了整个环节的成本、提升效率。随着容量规划技术的不断演进,2018年起,高可用架构团队希望可以把这些年在生成环境下的实践,贡献给社区,之后便有了Sentinel的开源。一边是作为发起者。将自己生产环境实践下沉淀出来的架构和技术贡献给社区。另一边是作为参与者。基于一些开源项目或云平台,输出可以解决开发者当前工作中存在的痛点的解决方案,例如近期新开源的项目Spring Cloud Alibaba 和 开发者工具 Alibaba Cloud Toolkit。相同的是,技术理想主义者都希望技术可以为让世界变得更好,这才是技术人的兴奋点。“让世界的技术因为阿里巴巴而变得更美好一点点”。这是阿里巴巴毕玄邮件签名中的一句话。他正和一群技术理想主义者,与太平洋另一边的技术高手们正面PK,在这场躲不开的战役中,一起认真一把。本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

November 20, 2018 · 1 min · jiezi

美团点评基于 Flink 的实时数仓建设实践

引言近些年,企业对数据服务实时化服务的需求日益增多。本文整理了常见实时数据组件的性能特点和适用场景,介绍了美团如何通过 Flink 引擎构建实时数据仓库,从而提供高效、稳健的实时数据服务。此前我们美团技术博客发布过一篇文章《流计算框架 Flink 与 Storm 的性能对比》,对 Flink 和 Storm 俩个引擎的计算性能进行了比较。本文主要阐述使用 Flink 在实际数据生产上的经验。实时平台初期架构在实时数据系统建设初期,由于对实时数据的需求较少,形成不了完整的数据体系。我们采用的是“一路到底”的开发模式:通过在实时计算平台上部署 Storm 作业处理实时数据队列来提取数据指标,直接推送到实时应用服务中。<center>图1 初期实时数据架构</center>但是,随着产品和业务人员对实时数据需求的不断增多,新的挑战也随之发生。数据指标越来越多,“烟囱式”的开发导致代码耦合问题严重。需求越来越多,有的需要明细数据,有的需要 OLAP 分析。单一的开发模式难以应付多种需求。缺少完善的监控系统,无法在对业务产生影响之前发现并修复问题。实时数据仓库的构建为解决以上问题,我们根据生产离线数据的经验,选择使用分层设计方案来建设实时数据仓库,其分层架构如下图所示:<center>图2 实时数仓数据分层架构</center>该方案由以下四层构成:ODS 层:Binlog 和流量日志以及各业务实时队列。数据明细层:业务领域整合提取事实数据,离线全量和实时变化数据构建实时维度数据。数据汇总层:使用宽表模型对明细数据补充维度数据,对共性指标进行汇总。App 层:为了具体需求而构建的应用层,通过 RPC 框架对外提供服务。通过多层设计我们可以将处理数据的流程沉淀在各层完成。比如在数据明细层统一完成数据的过滤、清洗、规范、脱敏流程;在数据汇总层加工共性的多维指标汇总数据。提高了代码的复用率和整体生产效率。同时各层级处理的任务类型相似,可以采用统一的技术方案优化性能,使数仓技术架构更简洁。技术选型1.存储引擎的调研实时数仓在设计中不同于离线数仓在各层级使用同种储存方案,比如都存储在 Hive 、DB 中的策略。首先对中间过程的表,采用将结构化的数据通过消息队列存储和高速 KV 存储混合的方案。实时计算引擎可以通过监听消息消费消息队列内的数据,进行实时计算。而在高速 KV 存储上的数据则可以用于快速关联计算,比如维度数据。 其次在应用层上,针对数据使用特点配置存储方案直接写入。避免了离线数仓应用层同步数据流程带来的处理延迟。 为了解决不同类型的实时数据需求,合理的设计各层级存储方案,我们调研了美团内部使用比较广泛的几种存储方案。<center>表1 存储方案列表</center>方案优势劣势MySQL1. 具有完备的事务功能,可以对数据进行更新。2. 支持 SQL,开发成本低。1. 横向扩展成本大,存储容易成为瓶颈; 2. 实时数据的更新和查询频率都很高,线上单个实时应用请求就有 1000+ QPS;使用 MySQL 成本太高。Elasticsearch1. 吞吐量大,单个机器可以支持 2500+ QPS,并且集群可以快速横向扩展。2. Term 查询时响应速度很快,单个机器在 2000+ QPS时,查询延迟在 20 ms以内。1. 没有原生的 SQL 支持,查询 DSL 有一定的学习门槛;2. 进行聚合运算时性能下降明显。Druid1. 支持超大数据量,通过 Kafka 获取实时数据时,单个作业可支持 6W+ QPS;2. 可以在数据导入时通过预计算对数据进行汇总,减少的数据存储。提高了实际处理数据的效率;3. 有很多开源 OLAP 分析框架。实现如 Superset。1. 预聚合导致无法支持明细的查询;2. 无法支持 Join 操作;3. Append-only 不支持数据的修改。只能以 Segment 为单位进行替换。Cellar1. 支持超大数据量,采用内存加分布式存储的架构,存储性价比很高;2. 吞吐性能好,经测试处理 3W+ QPS 读写请求时,平均延迟在 1ms左右;通过异步读写线上最高支持 10W+ QPS。1. 接口仅支持 KV,Map,List 以及原子加减等;2. 单个 Key 值不得超过 1KB ,而 Value 的值超过 100KB 时则性能下降明显。根据不同业务场景,实时数仓各个模型层次使用的存储方案大致如下:<center>图3 实时数仓存储分层架构</center>数据明细层 对于维度数据部分场景下关联的频率可达 10w+ TPS,我们选择 Cellar(美团内部存储系统) 作为存储,封装维度服务为实时数仓提供维度数据。数据汇总层 对于通用的汇总指标,需要进行历史数据关联的数据,采用和维度数据一样的方案通过 Cellar 作为存储,用服务的方式进行关联操作。数据应用层 应用层设计相对复杂,再对比了几种不同存储方案后。我们制定了以数据读写频率 1000 QPS 为分界的判断依据。对于读写平均频率高于 1000 QPS 但查询不太复杂的实时应用,比如商户实时的经营数据。采用 Cellar 为存储,提供实时数据服务。对于一些查询复杂的和需要明细列表的应用,使用 Elasticsearch 作为存储则更为合适。而一些查询频率低,比如一些内部运营的数据。 Druid 通过实时处理消息构建索引,并通过预聚合可以快速的提供实时数据 OLAP 分析功能。对于一些历史版本的数据产品进行实时化改造时,也可以使用 MySQL 存储便于产品迭代。2.计算引擎的调研在实时平台建设初期我们使用 Storm 引擎来进行实时数据处理。Storm 引擎虽然在灵活性和性能上都表现不错。但是由于 API 过于底层,在数据开发过程中需要对一些常用的数据操作进行功能实现。比如表关联、聚合等,产生了很多额外的开发工作,不仅引入了很多外部依赖比如缓存,而且实际使用时性能也不是很理想。同时 Storm 内的数据对象 Tuple 支持的功能也很简单,通常需要将其转换为 Java 对象来处理。对于这种基于代码定义的数据模型,通常我们只能通过文档来进行维护。不仅需要额外的维护工作,同时在增改字段时也很麻烦。综合来看使用 Storm 引擎构建实时数仓难度较大。我们需要一个新的实时处理方案,要能够实现:提供高级 API,支持常见的数据操作比如关联聚合,最好是能支持 SQL。具有状态管理和自动支持久化方案,减少对存储的依赖。便于接入元数据服务,避免通过代码管理数据结构。处理性能至少要和 Storm 一致。我们对主要的实时计算引擎进行了技术调研。总结了各类引擎特性如下表所示:<center>表2 实时计算方案列表</center>项目/引擎StormFlinkspark-treamingAPI灵活的底层 API 和具有事务保证的 Trident API流 API 和更加适合数据开发的 Table API 和 Flink SQL 支持流 API 和 Structured-Streaming API 同时也可以使用更适合数据开发的 Spark SQL容错机制ACK 机制State 分布式快照保存点RDD 保存点状态管理Trident State状态管理Key State 和 Operator State两种 State 可以使用,支持多种持久化方案有 UpdateStateByKey 等 API 进行带状态的变更,支持多种持久化方案处理模式单条流式处理单条流式处理Mic batch处理延迟毫秒级毫秒级秒级语义保障At Least Once,Exactly OnceExactly Once,At Least OnceAt Least Once从调研结果来看,Flink 和 Spark Streaming 的 API 、容错机制与状态持久化机制都可以解决一部分我们目前使用 Storm 中遇到的问题。但 Flink 在数据延迟上和 Storm 更接近,对现有应用影响最小。而且在公司内部的测试中 Flink 的吞吐性能对比 Storm 有十倍左右提升。综合考量我们选定 Flink 引擎作为实时数仓的开发引擎。更加引起我们注意的是,Flink 的 Table 抽象和 SQL 支持。虽然使用 Strom 引擎也可以处理结构化数据。但毕竟依旧是基于消息的处理 API ,在代码层层面上不能完全享受操作结构化数据的便利。而 Flink 不仅支持了大量常用的 SQL 语句,基本覆盖了我们的开发场景。而且 Flink 的 Table 可以通过 TableSchema 进行管理,支持丰富的数据类型和数据结构以及数据源。可以很容易的和现有的元数据管理系统或配置管理系统结合。通过下图我们可以清晰的看出 Storm 和 Flink 在开发统过程中的区别。<center>图4 Flink - Storm 对比图</center>在使用 Storm 开发时处理逻辑与实现需要固化在 Bolt 的代码。Flink 则可以通过 SQL 进行开发,代码可读性更高,逻辑的实现由开源框架来保证可靠高效,对特定场景的优化只要修改 Flink SQL 优化器功能实现即可,而不影响逻辑代码。使我们可以把更多的精力放到到数据开发中,而不是逻辑的实现。当需要离线数据和实时数据口径统一的场景时,我们只需对离线口径的 SQL 脚本稍加改造即可,极大地提高了开发效率。同时对比图中 Flink 和 Storm 使用的数据模型,Storm 需要通过一个 Java 的 Class 去定义数据结构,Flink Table 则可以通过元数据来定义。可以很好的和数据开发中的元数据,数据治理等系统结合,提高开发效率。Flink使用心得在利用 Flink-Table 构建实时数据仓库过程中。我们针对一些构建数据仓库的常用操作,比如数据指标的维度扩充,数据按主题关联,以及数据的聚合运算通过 Flink 来实现总结了一些使用心得。1.维度扩充数据指标的维度扩充,我们采用的是通过维度服务获取维度信息。虽然基于 Cellar 的维度服务通常的响应延迟可以在 1ms 以下。但是为了进一步优化 Flink 的吞吐,我们对维度数据的关联全部采用了异步接口访问的方式,避免了使用 RPC 调用影响数据吞吐。对于一些数据量很大的流,比如流量日志数据量在 10W 条/秒这个量级。在关联 UDF 的时候内置了缓存机制,可以根据命中率和时间对缓存进行淘汰,配合用关联的 Key 值进行分区,显著减少了对外部服务的请求次数,有效的减少了处理延迟和对外部系统的压力。2.数据关联数据主题合并,本质上就是多个数据源的关联,简单的来说就是 Join 操作。Flink 的 Table 是建立在无限流这个概念上的。在进行 Join 操作时并不能像离线数据一样对两个完整的表进行关联。采用的是在窗口时间内对数据进行关联的方案,相当于从两个数据流中各自截取一段时间的数据进行 Join 操作。有点类似于离线数据通过限制分区来进行关联。同时需要注意 Flink 关联表时必须有至少一个“等于”关联条件,因为等号两边的值会用来分组。由于 Flink 会缓存窗口内的全部数据来进行关联,缓存的数据量和关联的窗口大小成正比。因此 Flink 的关联查询,更适合处理一些可以通过业务规则限制关联数据时间范围的场景。比如关联下单用户购买之前 30 分钟内的浏览日志。过大的窗口不仅会消耗更多的内存,同时会产生更大的 Checkpoint ,导致吞吐下降或 Checkpoint 超时。在实际生产中可以使用 RocksDB 和启用增量保存点模式,减少 Checkpoint 过程对吞吐产生影响。对于一些需要关联窗口期很长的场景,比如关联的数据可能是几天以前的数据。对于这些历史数据,我们可以将其理解为是一种已经固定不变的"维度"。可以将需要被关联的历史数据采用和维度数据一致的处理方法:“缓存 + 离线"数据方式存储,用接口的方式进行关联。另外需要注意 Flink 对多表关联是直接顺序链接的,因此需要注意先进行结果集小的关联。3.聚合运算使用聚合运算时,Flink 对常见的聚合运算如求和、极值、均值等都有支持。美中不足的是对于 Distinct 的支持,Flink-1.6 之前的采用的方案是通过先对去重字段进行分组再聚合实现。对于需要对多个字段去重聚合的场景,只能分别计算再进行关联处理效率很低。为此我们开发了自定义的 UDAF,实现了 MapView 精确去重、BloomFilter 非精确去重、 HyperLogLog 超低内存去重方案应对各种实时去重场景。但是在使用自定义的 UDAF 时,需要注意 RocksDBStateBackend 模式对于较大的 Key 进行更新操作时序列化和反序列化耗时很多。可以考虑使用 FsStateBackend 模式替代。另外要注意的一点 Flink 框架在计算比如 Rank 这样的分析函数时,需要缓存每个分组窗口下的全部数据才能进行排序,会消耗大量内存。建议在这种场景下优先转换为 TopN 的逻辑,看是否可以解决需求。下图展示一个完整的使用 Flink 引擎生产一张实时数据表的过程:<center>图5 实时计算流程图</center>实时数仓成果通过使用实时数仓代替原有流程,我们将数据生产中的各个流程抽象到实时数仓的各层当中。实现了全部实时数据应用的数据源统一,保证了应用数据指标、维度的口径的一致。在几次数据口径发生修改的场景中,我们通过对仓库明细和汇总进行改造,在完全不用修改应用代码的情况下就完成全部应用的口径切换。在开发过程中通过严格的把控数据分层、主题域划分、内容组织标准规范和命名规则。使数据开发的链路更为清晰,减少了代码的耦合。再配合上使用 Flink SQL 进行开发,代码加简洁。单个作业的代码量从平均 300+ 行的 JAVA 代码 ,缩减到几十行的 SQL 脚本。项目的开发时长也大幅减短,一人日开发多个实时数据指标情况也不少见。除此以外我们通过针对数仓各层级工作内容的不同特点,可以进行针对性的性能优化和参数配置。比如 ODS 层主要进行数据的解析、过滤等操作,不需要 RPC 调用和聚合运算。 我们针对数据解析过程进行优化,减少不必要的 JSON 字段解析,并使用更高效的 JSON 包。在资源分配上,单个 CPU 只配置 1GB 的内存即可满需求。而汇总层主要则主要进行聚合与关联运算,可以通过优化聚合算法、内外存共同运算来提高性能、减少成本。资源配置上也会分配更多的内存,避免内存溢出。通过这些优化手段,虽然相比原有流程实时数仓的生产链路更长,但数据延迟并没有明显增加。同时实时数据应用所使用的计算资源也有明显减少。展望我们的目标是将实时仓库建设成可以和离线仓库数据准确性,一致性媲美的数据系统。为商家,业务人员以及美团用户提供及时可靠的数据服务。同时作为到餐实时数据的统一出口,为集团其他业务部门助力。未来我们将更加关注在数据可靠性和实时数据指标管理。建立完善的数据监控,数据血缘检测,交叉检查机制。及时对异常数据或数据延迟进行监控和预警。同时优化开发流程,降低开发实时数据学习成本。让更多有实时数据需求的人,可以自己动手解决问题。参考文献流计算框架 Flink 与 Storm 的性能对比关于作者伟伦,美团到店餐饮技术部实时数据负责人,2017年加入美团,长期从事数据平台、实时数据计算、数据架构方面的开发工作。在使用 Flink 进行实时数据生产和提高生产效率上,有一些心得和产出。同时也积极推广 Flink 在实时数据处理中的实战经验。招聘信息对数据工程和将数据通过服务业务释放价值感兴趣的同学,可以发送简历到 huangweilun@meituan.com。我们在实时数据仓库、实时数据治理、实时数据产品开发框架、面向销售和商家侧的数据型创新产品层面,都有很多未知但有意义的领域等你来开拓。 ...

October 19, 2018 · 2 min · jiezi