首页 文章 精选 留言 我的

精选列表

搜索[告别],共769篇文章
优秀的个人博客,低调大师

中国数据库告别卡脖子之忧:阿里OceanBase霸气卫冕全球第一

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。 中国自研OceanBase数据库,又刷新了世界纪录。 时隔七月,再次在TPC-C公开证明实力。 但这一次,不只是新晋霸主地位的巩固,也不止于打破业界尘封9年世界纪录后的新里程碑…… 更是技术性能benchmark、底层基础自主研发,以及全球标准话语权的关键事件。 很多年后回溯起来,这还可能是两个时代的分水岭。 数据库、操作系统和芯片,科技产业和数字化经济中三大当之无愧的底座技术,之前无一项主动权掌握在中国手中。 现在,阿里巴巴、支付宝,十年之功、20万亿行代码之力——在数据库领域,打破全球纪录的7个月后,再次创造了新的标准线。 究竟是怎样的成就? 去年十一,我们就报道过,阿里自主研发的金融级分布式关系数据库OceanBase,在国际事务处理性能委员会(TPC)的TPC-C基准测试中登上榜首。 这一成绩还打破了由美国公司甲骨文(Oracle)保持了9年之久的世界记录,成为首个登顶该榜单的中国数据库产品。 中国工程院院士、计算机专家李国杰都盛赞说:“这是中国基础软件取得的重大突破。” 如今,7个月后,纪录再度被刷新。 OceanBase不仅打破了去年自己保持的世界纪录,性能分数首次突破7.07亿,相比去年大幅提升近11倍。 而且这一次还是扩展能力的展现,在分布式架构下使用超过1500个节点的数据库集群,最终实现了整体性能的大幅提升——这在传统的集中式数据库是无法想象的。 更重要的是,在产业领域,分布式数据库解决了传统数据库几十年的难题,标志着数据库行业迎来了新一轮技术变革。 TPC-C,被誉为“数据库领域的世界杯”。 是全球主流计算机硬件厂商、数据库厂商公认的性能评价标准,其对数据库系统的软硬件协同能力要求极高。 也是全球目前最具公信力的联机交易处理(OLTP)数据库的功能与性能结合的测试标准,金融、电信、政府等关键领域的客户,一般参照 TPC-C 结果来衡量各个数据库厂商的事务处理能力。 更直接来说,TPC-C的测试就是数据库产品真实实力的最佳公开证明。 具体到测试本身,主要涵盖两大方向,分别是基本属性和压力性能。 在模拟真实交易环境并考察数据库基本性能的需求下,要求连续运行至少2小时,通过每分钟创建新订单数量来评价数据库的性能和性价比,规定测试任务需要在指定时间内完成,95%事务在1s内完成。 所以一款商业数据库想要向业界证明自身实力,TPC-C测试,绝对是一项硬指标。 然而,TPC-C排行榜长期被甲骨文、IBM和微软等传统数据库和硬件厂商占据…… 中国自研品牌的身影,从未出现过。 直到2019年9月,阿里一鸣惊人,打破甲骨文长达9年的霸榜垄断。 然而当是时,虽然成绩超第一名甲骨文纪录两倍有余,但外界依然有不少质疑的声音,且认为“蹭”了硬件红利。 于是这一次,时隔7个月再战——硬件基本无变化,要的就是技术架构和软件实力的证明。 所以也有外界评价说:「再无敌手,独孤求败」。 但参与此次“证明”的阿里工程师表示:这个评价听起来太狂了。 不过也认同,在数据库领域,技术架构的优越和领先,确实短时间内是很难超越的。 阿里凭什么? 这一次,OceanBase在测试压力性能时被要求连续运行至少八小时,1500多个数据库节点以及5000多万个仓库与对应数量的客户端参与其中,过程中上下抖动情况不超过1%。 以最苛刻的方式,无压力通过了该测试,而且短时间内,别人再以同样标准通过测试,几无可能。 OceanBase总经理杨冰,阿里连续两次刷榜的带头人。 他分享了OceanBase取胜的核心原因: 分布式整体系统可用性的技术创新。 即不用担心高额的软硬件投入来保障扩展性能所造成的杯水车薪,又可搞定节点故障无法使用主备镜像技术等问题。 以此为出发点,OceanBase大胆采用了Paxos分布式一致性协议,作为整个分布式数据库中最核心的技术之一。 OceanBase创始人阳振坤坦言,无论是主备库数据不一致还是分布式事务的技术缺陷,根本原因都在于关系型数据库自身软件高可用性的缺失,仅仅通过堆砌硬件红利来解决问题显然是治标不治本的做法;而OceanBase则是从数据库内部入手将问题解决。 当然,经过首次冲击TPC-C测试成功再到二次震撼TPC-C并满载而归,期间OceanBase技术团队也做了很多重要的优化升级工作。 例如提供兼容Oracle的租户模式并支持兼容PL/SQL的存储过程;实践分布式并行查询的新执行引擎帮助更好支持TPC-H这类场景测试,更快走向混合负载等。 关于兼容Oracle的工作难点,杨冰强调OceanBase团队的目标是打算用两年时间做到业务的平滑迁移,不需要修改一行代码,也不需要业务做任何调整,但过程中由于Oracle本身功能较多,先去突破哪些具体的内容确实是一种挑战。 另外甲骨文一直以来都是一家技术能力强大的企业,对自身专利权限十分看重,未来在兼容工作进行过程中技术团队认为务必要基于自研数据库的属性对类似功能的加持保持慎重。 更重要的是,分析甲骨文单机数据库强大的技术功能后,OceanBase团队发现其混合负载是其重要的技术杀手锏,“未来在OceanBase分布式技术架构中实现此项功能的确算是一种不小的技术挑战。” 此外,对于OceanBase来说,公开挑战里的成功,只是日常实力的证明方式之一。 与诸多中国技术公司一样,业务场景才是最好的练兵场,而且中国业务场景下的挑战,可能比基准测试还要复杂多变得多。 或许你多少有了解,支付宝投身OceanBase获得成功,除了强大的专业技术人才投入之外,更重要的是阿里经济体与支付宝业务为代表的的互联网规模、金融级场景的复杂度,以及每年双十一大促时期的大型历练机会…… 这些都为其提供了天然的练兵场,因为只有经过丰富的业务场景考验才能证明数据库系统的通用性,“用出来”才是硬道理。 举个例子,在高效解决银行业务从传统Oracle迁移到OceanBase的有关问题时,由于实操经验丰富,团队早已面向开发者、运维人员等不同技术层面人群提供了完成与大数据链路同步以及异构数据库、同构数据库同步与迁移的诸多工具,例如OCP、OMS等。 现如今随着OceanBase在金融场景的商用化程度越发深入,创始人阳振坤表示,未来团队更想该产品代表下一代分布式数据库的技术趋势前沿与发展方向,在除金融行业以外的多个领域。 例如交通、铁路与航天等也都陆续出现OceanBase的身影,夯实金融场景技术创新之余大力推进商用化进程,逐渐成长位至关重要的通用性技术。 包括如今面貌一新的国民应用,目前背后底座就是OceanBase。 所以可以想见,随着TPC-C的再次实力证明,会有更多公司、业务、场景和领域,用上全球领先且中国自研的OceanBase数据库。 在波诡云谲的大环境中,不必再担心任何形式的断供。 十年磨一剑 但即便如此,OceanBase一路走来,也并非轻而易举。 现在看到的是全球瞩目,之前却有十年的风雨兼程。 OceanBase创始人阳振坤回忆,当时完全是凭借技术灵感,认定传统集中式数据库,总会有尽头。 “我虽然不是做数据库的,但长期的分布式经验让我觉得像Oracle那种单机数据库总会有个尽头。毕竟业务数据量没几个月就要翻一翻,分布式绝对是个机会。” △OceanBase创始人阳振坤 于是当年6月25日,OceanBase正式立项。 又一年,OceanBase 0.1版本正式发布,在淘宝收藏夹上线,成功帮助淘宝收藏夹业务的数据库服务器数量大幅度减少。 2013年,支付宝开始启动“去 IOE”,即去掉了Oracle数据库、IBM小型机和EMC存储。 2014年支付宝交易库上线,OceanBase产品真正带到金融核心业务。 2017年第一个外部用户南京银行也正式上线OceanBase。 再到去年9月,一战成名,打破垄断。 但更重要的是今年3月,OceanBase宣布正式通过阿里云向全球开放,实现更广泛的高可用、高性能、低成本服务。 而筚路蓝缕的研发之路中,一度因为困难重重、中途因为找不到愿意使用的业务,OceanBase团队还曾经濒临解散。 如今春风化雨,一切尽付笑谈中。 更重要的是,曾经因为数据库技术垄断,甲骨文创始人拉里·埃里森,让中国合作方在零下二十多度的凛冽环境中苦等2小时的傲慢往事,或许再也不会有了。 现在,我们不仅有了国产自研OceanBase数据库可供选择,而且OceanBase,也是最好的选择。 接下来,就看操作系统和芯片的了。

优秀的个人博客,低调大师

关于5G的10个问答 让我们告别盲人摸象

第五代(5G)移动网络来临,但目前在科技界面临挑战以及让人感到深不可测。先锋概念公司总裁Will Strauss上周告诉记者,“从某些方面来说,5G有点像俗话里说的几个盲人在摸象。” 在不久前移动通信世界大会召开的前夕,我们向一些行业分析师和观察人士提了10个问题。 我们与之交谈过的行业观察人士之中有GSM协会(GSMA)技术总监David Hutton以及美国国家仪器公司(NI)射频通信和软件无线电(SDR)主管James Kimery。 GSMA是一个移动运营商和相关企业的协会,致力于支持推广各类标准。Hutton的解释是,协会的使命是引导产业聚焦“使用案例”和发展惠及消费者和企业的新标准。他表示,“5G发展不应该仅仅是由科技的发展推动的。” NI是个自动化测试设备和虚拟仪器软件公司。NI是蜂窝通信社区的新人。NI和4G或任何以前的旧标准的制定关系极少。据Kimery说,到2010年时这种情况有了彻底的改变。 5G本身和5G样机的开发颇为复杂,这使得NI的软件定义无线电平台成了涉及5G创新的学术研究人员和电信设备厂商手里不可或缺的工具。 NI现时在5G社区拥有独特的地位,它参加各种试验和有关制定标准的会议,是一个敏锐的观察者。NI公司以中立的态势见证5G的发展。 1、新兴的5G标准能提供什么? 据NI的Kimery介绍,5G可望提供的优势在于三个方面:为智能设备提供宽带数据、车用超可靠、超快、超低延迟通信以及为海量的连接设备提供机器类通信。 Jim McGregor是TIRIAS研究所的创始人和首席分析师,他表示,“5G有一些重要和关键的构成成分,包括:5G加强型载波的整合;与Wi-Fi和免授权频段和物联网解决方案的整合。” 2、5G将会和4G兼容吗? Kimery表示, “不兼容。目前讨论的5G技术不会走1G、2G和3G的路。” 而GSMA协会技术总监David Hutton就回答得更详细些。他表示,“由于5G技术并不是一种技术而是个含括各种标准的“生态系统”,我们会见到5G将会保持与4G一些后向兼容性。” Kimery的不兼容假设是基于3GPP(第三代合作伙伴计划)去年秋天在美国凤凰城的关于5G的讨论。当时,3GPP有下列的约定: 无线频段小于 6兆赫和大于6兆赫 向后兼容的无线接入技术(RAT)--- LTE演进 非向后兼容RAT---新的5G RAT 先锋概念的Straus的归纳是:“我觉得有一件事很明显,5G(约2020年)的基站控制逻辑将基于LTE,加入更多、更高的频率后,多个频率(载波整合)之间会更加黏合,随基站MIMO和定向广播而来的是天线数目变大。” 3、我们见过许多5G试验。我们连5G标准都没有,他们在试验什么呢? 其实,大部分这些试验都是“前期商业试验”,重点是技术可行性和可靠性。坊间对6GHz以上的毫米波频谱用于5G的兴趣越来越大。Kimmery表示,”对手机通信行业的每一个人来说这都是一个大飞跃。到目前为止,手机通信行业用的谱率都低于6GHz。” 而在蜂窝系统里启动毫米波的使用有其挑战性。挑战包括需要解决高频带信道带来的各种缺陷和应付这种信道的传播特性。 Kimmery表示,许多运营商和网络设备厂商在测试自己提出的系统的性能和收集结果。 4、这样说来,大家都盯着使用6GHz毫米波系统里不同频段的测试结果。各运营商/设备团队测试系统用的频率是什么样的情况? Kimmery表示,不幸的是,大多数运营商和设备厂商都对自己的试验内容和结果三缄其口。GSMA的Hutton表示同意,他表示,“是的,他们都是在私底下进行。” Kimery称,只有一个例外,NTT DoCoMo是个例外。 NTT DoCoMo公司在11月透露了公司截至目前为止的5G试验的一些细节。 DoCoMo和诺基亚网络去年十月在东京高楼林立的六本木进行了5G试验,用的是毫米波信号,甚高频70GHz。公司的报告提到,实现了“超高速数据传输,高于2Gbps”。 日本电信商DoCoMo称,该试验是在商业区内进行的第一次5G数据传输试验。 DoCoMo还进行了其他5G试验,包括11月与韩国三星一起做的那次,用的是28GHz高频信号,同时还用到多天线和波束跟踪的波束形成技术 。 5、他们什么时候会分享这些测试结果呢? Kimery 表示,5G技术工作委员会定于3月7-10号在瑞典哥德堡开会。他表示,“我们希望运营商和设备供应商将分享他们的数据,分享他们的样机测试结果。” 6、带我们走一轮5G标准化的时间表。 5G的研究阶段将于2017完成工作(最有可能是3月,届时14版出笼)。行业的目标是在2018年9月敲定5G修订版 1.0的第一期。第二期将于2019年12月完成。 7、5G的第一期和第二期段是前向兼容的吗? Kimery表示,委员会已经同意行业将保持2018年5G第一期和2020年加入的创新之间的兼容性。 8、5G的种种对各种人是各种东西。5G是不是被拉向不同的方向? Hutton承认,GSMA已经为新兴5G标准确定了70个不同的使用实例。他表示,这些实例从智能计表到触觉互联网、到虚拟现实等等无所不包。 增强型移动宽带通信的技术要求可能 不完全和关键可靠、无延迟通信或大规模的物联网设备的要求是一样的。 这里什么优先级别高什么优先级别低就变得至关重要。这会主导5G第一期发展的焦点所在。 9、那5G第一期最可能的焦点是什么呢? Kimmery提出,“对于电信商来说最紧迫的问题仍是移动数据的快速增长。”事态的发展很可能处决于数据的增加。 尽管其他诸如大规模MIMO、波束形成、新的波形和新的调制方案等一些技术也必须考虑,Kimery认为毫米波必定是敲定5G第一期标准的讨论的前沿和中心。 Hutton不那么确定,他觉得毫米波还是带点“学术”色彩。他指出,虽然有些应用实例会受惠于较高的频率,“我们需要看到不同的技术走到了一起”,最终使得 5G可以满足不同行业的广泛需求。 10、5G第一期标准化成功的关键是什么呢? Kimery强调指出,用上毫米波技术,“选定一个频率是很重要的”。他称,无论是28GHz、39Ghz或70GHz,“要选一个”。他补充说,“我们可以以一个频率为焦点,再扩展到其他频率就变得更容易些。” 原文发布时间为:2016年03月07日 本文作者:李超 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

魅族的野心与挑战:告别小而美 品牌形象成阻碍

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 “我喜欢魅族,是因为白永祥(魅族总裁)的实在,不像有些厂商的老板尽说些大话。”魅族PRO5发布会前,一位自费从内蒙古呼和浩特专程请假坐火车赶来北京参加发布会的魅友(魅族粉丝)告诉腾讯科技,自己作为魅族多年的用户,对过去的MX4和MX5两款手机却很不满意。他将希望寄托在了即将发布的PRO5。 某种程度上,白永祥的确很实在。在接受腾讯科技等媒体访谈时,白永祥不小心透露自己平时爱看《花千骨》。 “现在的年轻人不都爱看高颜值嘛。”专访结束后,白永祥匆匆走出房间,三步并作两步,边走边对腾讯科技解释,自己其实是在追赶潮流。 过去一年的魅族,又何尝不是在追赶潮流?学小米走高性价比模式,推出千元手机品牌魅蓝,引入阿里战略投资,再紧随华为小米之后进军高端手机市场。至此,魅族手机的子品牌定位已然明朗,魅蓝是定价千元机市场的青年良品,MX是超高性价比的中端,而PRO则是其定义的高端品牌。 那家追求***、特立独行的公司不见了,取而代之的是要走全产品线、冲销量、看业绩、追求利润,回归商业世界的魅族。 在过去的一年时间里,魅族一共发布了8款机型。这意味着,平均每隔一个半月,魅族就要请歌星或乐队在北京国家会议中心High一次。 这一次,魅族更是下血本请来了以“上头条”著称的《中国好声音》第四季导师汪峰。“全部都站起来!”一站上台,汪峰就立即调动起全场的气氛。声嘶力竭用力嘶吼的他,与快速求变疯狂追赶的魅族,确有几分相似。 回归高端的内因 魅族曾是一家带有浓厚黄章色彩的公司,从来只追求产品的***,而对产品之外的其他事,甚至包括销量,都毫不关心,原本在自己的世界里很是滋润。直到2011年小米手机的出现,才在魅族平静的湖面上惊起一阵波澜。不过,顽固的黄章任凭外界风吹浪打,我自岿然不动。 而另一家国产手机厂商华为彻底觉醒,也是2013年底的事了。从那时起,华为开始将“荣耀”作为独立手机品牌运作,与小米一样采用电商模式,预约销售、定时抢购。高举“高性能”和“低价格”的旗号。 而后知后觉的魅族,确如其创始人黄章所言“大彻大悟得有点迟了”。终于在2014年9月宣布新发布的MX4手机售价为1799起,比高冷的MX3起售价足足低了700元,并于去年12月发布全新子品牌“魅蓝”,搅局千元智能机市场。 然而,随着多家国产厂商集体涌入,千元手机市场的竞争日趋激烈,这一价位的手机市场不断被蚕食,已经逐渐趋于饱和。 这时候,为几百元争得头破血流的国产厂商开始发现,高端手机市场仍然被苹果、三星把控,并瓜分了手机市场利润的绝大多数,但这一领域有实力的玩家并不多。于是,华为、小米各自发布了Mate7和小米Note顶配版瞄准高端手机市场。 在高端手机市场长期被国外品牌霸占以及国内高端手机品牌不足的情况下,魅族自然也想分得一杯羹。 从另一个层面讲,无论是否真有对赌协议,在获得阿里5.9亿美元战略投资以后,魅族必须在手机出货量上保持高速增长,不能再由黄章一味地任性,仅仅只做“小而美”的公司。因此,走高性价比模式就成了为数不多的选择之一,而另一个选择则是拓宽产品线,往下进军千元机市场,往上回归高端阵营,保持高中低端不同定位的产品线同时运作。 面临的挑战 高端手机市场同台较量,魅族至少要证明其市场能力强于小米。 整个2015年上半年,小米几乎都在为同一款产品——小米Note大做文章,多次召开发布会,发布竹制后盖版、女神版、黑丝纪念版等多个版本。与此同时,一向很少投放线下广告的小米也在楼宇和公交站台等多处投放了小米Note的广告。 然而,小米方面迟迟不肯公布小米Note的出货量,始终未打消外界的疑虑。在3000元及以上手机市场,除了华为Mate7曾引起市场的追捧外,其他国产高端手机几乎都遭遇了滑铁卢。 小米的品牌定位偏向于中低端,对其高端手机小米Note顶配版的销量会有一定的阻碍。而对于魅族而言,也面临同样的问题。 魅族此前曾主打3000元左右的高端手机,但随着去年大幅降价与小米展开正面较量以来,其品牌形象已经发生改变,人们逐渐开始将“魅族”与“性价比”划等号,这将在某种程度上影响魅族PRO5的销售。 魅族去年全年手机销量500万台,今年仅上半年手机销量就已达到890万台,同比增长540%。 不过,低端手机有利于走量,魅族销量大幅上升很大程度上依赖于其定位千元机市场的魅蓝。相对而言,在高端手机市场要保持同样的势头要困难许多。 在国内,“抢购”已经成为手机行业的一种常态,但究其根源还在于供应链和产能上的不足。增加高端产品线后,魅族或面临一定的产能问题。 对此,李楠曾表示,魅族的产能依旧不够好。但他同时强调,需求一定是一夜之间爆发的,但是产能的提升不是一个工厂的事情,还有出货所面临的渠道,渠道所面临的用户以及售后支持等,魅族本可以在今年做到2500万或3000万销量,可是真不能做那么多。 此外,魅族已经开始进军国际市场,这或许在专利方面会对魅族提出更高的要求。 不过,魅族PRO5产品本身有诸多可圈可点之处,不再堆砌参数,而是将现有的功能做到精致,力求提升用户体验,这些都将在销量上有所体现。 “我相信这台手机在中国高端手机市场没有对标的品牌了。”李楠表示,魅族PRO5不计成本,不求销量,因为魅族上个月的手机销量达到289万台,已经足以让自己在手机市场中活下来。 在国内手机市场,此前3000元为一大分水岭,在此之上,是苹果三星的天下,二者以此赚得盆满钵满,在此之下,国产手机靠性价比“走量”,借此占领市场份额。如今,华为已经撕开了一条口子,而魅族才刚刚掀开一条缝。

优秀的个人博客,低调大师

告别数据库“膨胀”:Dify x SLS 构建高可用生产级 AI 架构

作者:无哲、言合 一、前言:Dify 的规模化挑战 Dify 是当前最受欢迎的低代码 LLM 应用开发平台之一,在 Github 上已斩获 120k+ 的星标数。国内外有众多企业基于 Dify 构建自己的智能体应用。阿里云可观测团队既是 Dify 的深度用户,也是社区的活跃贡献者。 在大规模生产实践中,我们发现 Dify 在高负载场景下面临显著的数据库性能瓶颈:其执行引擎高度依赖 PostgreSQL,单次 Chat 请求可能触发数百甚至上千次数据库访问;与此同时,Worker 进程在知识库索引构建、Trace 追踪等任务中也会持续写入大量数据。这频繁导致 DB 连接池打满、慢查询频发 等问题,已成为制约 Dify 集群横向扩展与并发能力的关键瓶颈。 二、现状与挑战:Dify 存储机制痛点分析 数据分布现状 Dify 的数据主要分为三类: Meta类 数据:租户、应用、工作流、工具等配置信息; 运行时日志:工作流执行明细、会话历史、消息记录等; 文件类数据:用户上传文件、知识库文档、多模态输出等(通常存于对象存储)。 其中Meta 与运行日志均存储在 PostgreSQL 中,运行时日志占据了数据库的绝大部分资源。以我们的生产环境为例,运行日志占 DB 存储空间的 95%以上。在访问频率最高和慢查询最多的 SQL 模式中,绝大多数都与运行日志的读写相关。 Dify 的运行日志包含工作流的执行明细记录和会话消息数据,执行记录中有工具输出、模型上下文等大量长文本信息,并且运行日志数量也会随着用户请求快速增长。 核心痛点 将这类海量、高吞吐的日志数据全量存储在 PostgreSQL 中,带来了多重挑战: 负载压力大: Workflow 节点的每次执行都会产生明细日志(节点执行明细数据,记录节点的输入输出和运行状态等数据),高并发下 workflow_node_executions 表的读写极易成为热点。 连接占用: 尽管 Dify 1.x 的几个版本对数据库长连接问题做了很多优化(如 issue #22307[1]),但日志密集访问仍加剧连接池压力,影响核心业务的连接获取。 扩展性不足: 运行日志随着业务量呈爆发式增长,而 PG 扩容依赖垂直升配,升级规格往往伴随主备切换导致的连接闪断或维护窗口,难以实现完全的无感扩容。社区已有多个反馈(如 issue #18800 [2]因会话数据堆积导致首 Token 延迟增加 3 秒; issue #22796 [3]呼吁将日志迁出 PG) 分析加工能力缺失: 控制台仅支持有限关键词检索,难以满足业务对历史会话进行多维分析、二次加工及精细化运营的需求。 社区的积极探索与演进 运行日志存储一直是影响 Dify 系统性能与稳定性的痛点。针对这一问题,社区一直在积极寻求解决方案,并已落地了多项优化措施: 内存数据库(issue #20147[4]):适用于无需持久化的轻量场景,同时新版执行引擎已完成日志存储抽象,为后续异构存储改造奠定了基础。 后台异步执行( issue #20050[5]):通过 Celery Worker 异步写入日志,有效降低了核心链路的延迟,减轻了 API 引擎对 DB 的同步依赖。 周期性清理( issue #23399[6]):引入自动清理机制,定期移除陈旧的会话与执行记录,有效缓解了数据库存储膨胀问题。 大字段分离存储: 针对 LLM 长上下文导致的大字段问题,支持将超长字段截断并转存至对象存储,减轻了 DB 的 I/O 压力。 根因分析:数据特征与存储引擎的错配 上述优化在特定阶段非常有效,缓解了 Dify 的燃眉之急,但在大规模生产场景下,应用层的逻辑优化(异步、清理等)已触及天花板。要彻底解决扩展性问题,必须消除数据特征与存储引擎的错配------即我们一直在试图用"关系型数据库"去承载本该由"日志系统"处理的数据。 Dify 工作流记录虽然并非完全是Append-Only写,但具有鲜明的日志特征,与典型的业务数据(如用户信息、应用配置)截然不同: 终态不可变: 记录仅在执行期短暂流转,结束后即成为"只读"档案。在 PG 中长期留存海量只读数据,不仅挤占昂贵的 SSD 资源,庞大的表数据更会显著降低索引效率与查询性能。 泛结构化与 Schema 易变: 核心负载为巨大的 JSON 对象(每个工作流节点的Inputs/Outputs),且结构随版本迭代。PG 难以高效处理深层 JSON 检索,且亿级大表的 DDL 变更会引发长时间锁表风险。 高吞吐时序写入: 日志随时间源源不断地产生,持续消耗 IOPS 与数据库连接。请求高峰期极易导致连接池耗尽,导致创建应用等核心业务因资源争抢而失败。 因此,我们需要一种支持存算分离、弹性伸缩、低成本且具备原生 OLAP 能力的存储架构。阿里云日志服务(SLS) 凭借其云原生特性,成为解决这一瓶颈的最佳选择。 三、方案选型:为什么 SLS 更适合 Dify 日志场景 SLS 并不是"另一个数据库替代",它是为日志场景量身定制的基础设施。在Dify工作流日志场景下,相比于 PG,SLS 在以下四个维度实现了架构上的优化升级: 极致弹性,应对流量波动 Dify 业务常有突发流量(如 AI 推理高峰)。PostgreSQL 需按峰值预置硬件资源,低谷期的资源浪费,一旦流量突增超过预设上限,数据库稳定性会有问题。 而SLS 作为 SaaS 化云服务,天然支持秒级弹性伸缩,无须关心分片或容量上限,且默认支持 3AZ 同城冗余。 高写入吞吐 + 架构解耦,保障核心稳定 高并发写入: SLS 针对日志场景优化,数据以追加方式顺序写入,避免了数据库中常见的随机 I/O 和锁竞争,能以极低成本支撑数万 TPS 的写入吞吐,轻松应对 AI 业务的写入洪峰。 资源隔离: 将日志负载剥离至 SLS 云端,实现日志数据流与 Dify 核心业务事务的物理隔离,有效保障主业务系统的稳定性与性能。 海量日志,低成本长期留存 SLS 数据采用高压缩比技术,支持自动化分层存储,可将历史数据自动沉降至低频和归档存储,无需维护清理脚本,成本远低于数据库 SSD。这使得 Dify 能以极低的成本满足长周期的分析和审计需求。 开箱即用的数据价值释放能力 Schema-on-Read: SLS 写入时不强制校验 Schema,完美适配 Dify 快速迭代带来的字段变更,无需对历史数据重新变更。 秒级分析: SLS 内置了针对日志优化的分析引擎(倒排索引+列存)。开发者可以使用关键词从海量日志中检索,也可以利用 SQL 对亿级日志进行实时聚合分析,将日志数据转化为业务洞察。 丰富数据生态: 日志在SLS中,可以进一步进行更完善的处理和分析,比如数据加工清洗、联合分析、可视化、告警、消费和投递等等。 四、技术实现:核心架构改造与插件化 为了将 SLS 引入 Dify,整个工程实施分为两个部分:一是对 Dify 核心的插件化改造,二是基于 SLS 读写日志的插件实现。 1.Dify 核心插件化改造 Dify 早期架构中,工作流记录的读写逻辑深度耦合了 SQLAlchemy(PG ORM),扩展性受限。从 v1.4.1 以后社区引入了 WorkflowExecution 的领域模型(#20067[7])并开始逐步对工作流执行核心流程进行重构,定义了一套标准的 Repository 接口,涵盖日志的写入、更新、读取以及统计等标准行为。在 v1.8.0 社区引入了 Repository 的异步实现,通过推迟日志记录保存提升了工作流执行速度。 虽然 Repository 接口为多存储驱动提供了可能,但早期的抽象并不彻底:它主要解决了"写"的抽象,但大量"读"操作仍绕过 Repository 直接依赖 SQLAlchemy,且复杂的跨表 Join 查询使得存储层难以真正剥离。 为此,我们和 Dify 研发团队多次交流,确定了 Repository 抽象层的完整实现方案。我们通过剥离跨表关联查询、标准化读取与统计接口,真正实现了存储层的完全解耦与插件化加载。 2.SLS 日志插件实现 在插件实现过程中,核心挑战在于抹平关系型数据库(PG)与日志系统(SLS)在数据模型上的差异。为此,我们采用了以下技术策略: 基于多版本的状态管理 SLS 的 LogStore 是 Append-Only 追加写入,而Dify 的工作流执行过程存在状态流转,从 RUNNING 变为 SUCCEEDED/FAIL。因此我们采用了多版本控制的思路: 写入策略:每次状态更新,不覆盖旧日志,而是新写入一条包含完整状态的日志记录。我们在日志模型中引入了一个纳秒级的时间戳字段 log_version来区分版本。 读取策略:在查询或统计时,插件内部会生成聚合 SQL,对于同一个 workflow_run_id,始终选取 log_version 最大的那条记录作为最终状态。 Schema 自动同步 Dify 的迭代速度非常快,数据库模型经常发生变更。如果每次升级 Dify 都需要用户手动维护索引配置,将极大地增加运维负担。SLS 插件启动时会自动扫描 SQLAlchemy 模型定义,并与 SLS 索引配置进行 Diff。一旦发现新字段,自动调用 API 更新索引。用户无需手动维护索引,开发者也无须为 SLS 单独编写升级脚本。 原生 PG 协议兼容 值得一提的是,SLS 新增原生支持 PostgreSQL 协议。绝大部分原有的统计与分析 SQL,均可通过 PG 兼容模式直接发送到 SLS 上执行,极大地降低了插件的开发适配成本。 五、实践指南:配置与平滑迁移 该功能已正式合并至 Dify 社区主分支。基于Dify最新代码,只需进行简单配置,就可以将工作流执行记录切换到SLS存储。 第一步:准备工作 (1)创建 Project:在阿里云日志服务控制台创建 Project(建议与业务同地域) 无需手动创建 Logstore 和索引,Dify 启动后插件会自动检测并创建。 (2)获取访问凭证:获取具备 SLS 读写权限的 AccessKey ID 和 Secret。 可以授予 AliyunLogFullAccess,或按需配置最小权限(创建/查看Project、创建/查看logstore、创建/更新/查看索引、写日志、查日志等) 第二步:配置Dify 在 .env 或 docker-compose.yaml 中修改以下配置项,将工作流存储驱动指向 SLS 插件,并补充连接信息: # 1. 修改 Repository 驱动指向 SLS 插件 CORE_WORKFLOW_EXECUTION_REPOSITORY=extensions.logstore.repositories.logstore_workflow_execution_repository.LogstoreWorkflowExecutionRepository CORE_WORKFLOW_NODE_EXECUTION_REPOSITORY=extensions.logstore.repositories.logstore_workflow_node_execution_repository.LogstoreWorkflowNodeExecutionRepository API_WORKFLOW_NODE_EXECUTION_REPOSITORY=extensions.logstore.repositories.logstore_api_workflow_node_execution_repository.LogstoreAPIWorkflowNodeExecutionRepository API_WORKFLOW_RUN_REPOSITORY=extensions.logstore.repositories.logstore_api_workflow_run_repository.LogstoreAPIWorkflowRunRepository # 2. 新增 SLS 连接配置 ALIYUN_SLS_ACCESS_KEY_ID=your_access_key_id ALIYUN_SLS_ACCESS_KEY_SECRET=your_access_key_secret ALIYUN_SLS_ENDPOINT=cn-hangzhou.log.aliyuncs.com ALIYUN_SLS_REGION=cn-hangzhou ALIYUN_SLS_PROJECT_NAME=your_project_name ALIYUN_SLS_LOGSTORE_TTL=365 # 日志存储天数 # 3. 迁移开关配置 LOGSTORE_DUAL_WRITE_ENABLED=false LOGSTORE_DUAL_READ_ENABLED=true 为了保证存量 PG 用户能平滑升级到 SLS 版本,我们在插件中提供了两个开关: (1)双写机制:通过配置 LOGSTORE_DUAL_WRITE_ENABLED=True(默认关闭),系统会将日志同时写入 PG 和 SLS。这适用于存量用户迁移初期的灰度验证,确保在不改变原有数据流的情况下,验证 SLS 的配置正确性和 Dify 版本升级本身的兼容性。 (2)双读降级机制:通过配置 LOGSTORE_DUAL_READ_ENABLED=True(默认开启),系统优先从 SLS 读取日志。如果 SLS 中未找到该记录(例如迁移前的老历史数据),插件会自动降级回 PG 再次尝试读取。 六、成效对比:迁移到SLS的三大收益 收益一:DB压力显著下降 切换到SLS,相当于把现有PG中数据量最大的两张表的数据迁移走了。根据我们线上业务的数据,DB减少了95%以上的存储空间(运行时间越长,这个比例越高),并且读写过程中的DB的连接数、CPU等压力也有显著降低。 收益二:存储成本大幅降低 为了直观量化迁移后的成本收益,我们以一个典型的生产级场景进行估算:假设 Dify 应用日增日志 10GB,为了满足模型评估与回溯需求,需留存最近 300 天(约 3TB)的数据。 注:这里估算SLS成本的时候,已经将存多条状态记录会占用存储空间的因素考虑进去。 此外对于PG实际生产中还需额外考虑高可用多副本、预留存储空间、连接池扩容等隐性成本。 这里造成近 10 倍成本差距 的根本原因在于存储机制的不同。 Dify的工作流记录包含了用户提问、知识召回、工具调用和模型响应等数据,是评估和回归等任务需要的数据资产,长期留存价值高。 对于 PG: 存储时间越长,数据量越大,对昂贵的 SSD 存储空间占用就越多,成本会大幅增长。pg实例需要提前预估存储空间,存储空间不可能完全利用起来,必然闲置一部分空间。 对于 SLS: 专为日志设计的高压缩比与分层存储技术,使得存储数据量越大、时间越长,其边际成本优势越明显。 收益三:数据价值释放,从"运维监控"到"业务洞察" 这里我们以一个真实的 Dify 应用场景------"电商智能客服助手"为例,展示日志数据接入 SLS 后,如何挖掘其背后更大的业务价值。 (1)无缝集成,原生体验 接入 SLS 后,Dify 界面上的日志查询与回溯体验保持不变,但底层存储已完全切换。 日志回溯:Dify 控制台的日志详情页直接从 SLS 读取数据,响应更迅速。 监控图表:Dify 内置的监控统计图表,也是通过执行 SLS SQL 实时生成的。 (2)超越基础,SLS 进阶分析 虽然 Dify 内置了基础查询和统计功能,但面对复杂的业务分析需求,我们可以直接转至 SLS 控制台,解锁更强大的能力。 任意字段的高速检索 SLS 支持全文索引和任意键值对条件的组合查询,快速精准检索出符合某种特定特征的日志。 业务趋势分析(可视化)场景 比如这里我们分析"用户意图识别"这个工作流节点里,按识别出的用户意图的分类统计随时间变化的PV情,便于通过观察不同分类的趋势变化,做出相应的运营决策。 * and title: 用户意图识别 and intent | select json_extract(outputs, '$.intent') as "用户意图", date_trunc('minute', __time__) t, count(1) as pv group by "用户意图",t order by t limit all 异常诊断(漏斗分析)场景 可以通过漏斗图,分析观察工作流哪些中间节点出现异常失败的比率较高。 status:succeeded | select title, count(distinct workflow_run_id) cnt group by title order by cnt desc 成本与风险风控(实时告警)场景 配置告警规则,统计 LLM 节点的 Token 消耗,一旦超过预设阈值,立即触发钉钉/电话告警。 数据闭环(ETL 与加工)场景 利用数据加工和定时 SQL,对工作流的输入输出进行清洗、脱敏与标准化,构建持续更新的评估与训练数据集。 总之,将 Dify 工作流日志接入 SLS,不仅能高效查询日志,更能通过分析、可视化、告警和数据加工,将日志转化为业务洞察,真正实现从"看日志"到"懂业务"的跃升。 七、总结:迈向生产级 AI 架构 将 Dify 运行日志迁移至阿里云 SLS,并非一次简单的"存储替换",而是 Dify 向生产级高可用架构演进的关键一跃。 我们通过业务数据与日志数据解耦的架构改造,成功将高吞吐、泛结构化的日志流从事务型数据库中剥离。让 PostgreSQL 专注核心业务事务处理,让 SLS 充分发挥其在海量数据存储与分析上的原生优势。 这一特性带来的价值是全方位的: 解决DB性能瓶颈: 将日志与核心事务解耦,从根本上解决数据库瓶颈,保证核心业务稳定性。 大幅降低日志成本: 利用SLS的弹性伸缩、高压缩比、分层存储,低成本存储海量日志。 充分释放数据价值: 从简单的日志查看升级为强大的实时分析、监控告警、加工处理,将运维数据转换为业务洞察。 如果您正在构建大规模的 AI 应用,或者正被 Dify 数据库的性能瓶颈所困扰,现在就是升级的最佳时机。拥抱云原生日志架构,让您的 Dify 跑得更快、更稳、更智能。 参考链接: [1]https://github.com/langgenius/dify/issues/22307 [2]https://github.com/langgenius/dify/issues/18800#event-17534118862 [3]https://github.com/langgenius/dify/issues/22796 [4]https://github.com/langgenius/dify/issues/20147 [5]https://github.com/langgenius/dify/pull/20050 [6]https://github.com/langgenius/dify/issues/23399 [7]https://github.com/langgenius/dify/pull/20067

优秀的个人博客,低调大师

告别多源数据处理繁琐!SpreadJS 让筛选排序如 Excel 般顺手

在数据处理领域,Excel 以其直观易用的筛选与排序功能,成为众多用户日常办公的 "必备工具"。无论是从海量员工信息里精准定位特定部门成员,还是按多维度优先级梳理销售数据,筛选与排序都是提升数据可读性、分析效率的关键手段。即便是在电商平台,仍有大量从业者依赖 Excel 来快速筛选、分析数据。 然而,Excel 存在明显短板 ------ 无法对多平台数据进行整合。当企业面临多数据源、海量数据处理需求时,就需要一款既能兼容 Excel 操作习惯,又具备多数据源整合能力的电子表格工具。经过多方探寻,SpreadJS 脱颖而出。 选择 SpreadJS,核心在于它高度契合 Excel 的交互体验,能适配业务人员既有操作习惯,实现线下报表向线上的无缝迁移;其强大的自动化数据处理与报表生成能力,可大幅减少人工冗余操作;它还能兼容复杂报表与多数据源,支持主流前端框架集成。同时,SpreadJS 提供单元格级权限管控与协同编辑功能,满足了企业级数据安全与共享的需求。 接下来,结合一组旅游数据,先带大家认识 SpreadJS 筛选,排序功能。 这个面板与 Excel 高度一致,涵盖了排序、按颜色排序、按颜色筛选、文本筛选以及列表筛选等功能。 一、筛选功能 升序 / 降序 升序 / 降序:点击 "升序",该列数据按升序规则排列,是针对当前列的快速单例升序操作;点击 "降序",则按降序规则排列,为单例降序快速操作方式。 按颜色排序 / 筛选 按颜色排序 / 筛选:"按颜色排序" 可依据单元格背景颜色或字体颜色对数据排序,比如将背景为红色的单元格数据排前,便于从视觉层面整理数据;"按颜色筛选" 能筛选出具有特定背景颜色或字体颜色的单元格数据,快速定位符合颜色特征的数据行。 文本/数字/日期筛选 文本/数字/日期筛选:可对文本类型数据进行复杂筛选,如筛选出包含特定文字、以特定文字开头 / 结尾、等于 / 不等于某一文字的记录,精准定位文本数据。 文本筛选中的高级用法 1. 通配符筛选 使用场景:当你需要筛选出包含特定字符模式的数据时,通配符就非常有用。Excel 中有两个通配符:问号(?)代表单个字符,星号(*)代表任意多个字符。 操作示例: 在 "city" 列进行筛选,如果要筛选出城市名是两个字的城市,在自定义筛选的条件框中输入 "??"; 若要筛选出城市名中包含 "安" 字的城市,输入 "安"。 2. 多条件逻辑筛选 使用场景:当需要根据多个文本条件筛选数据时,可使用 "与" 和 "或" 逻辑。 操作示例:假设要筛选出城市名中包含 "西" 或者包含 "南" 的城市,在自定义筛选中,第一行条件选择 "包含",输入 "西",第二行条件选择 "包含",输入 "南",然后选择 "或" 关系;若要筛选出城市名中既包含 "北" 又包含 "京" 的城市(这种情况一般针对特定数据,如只有 "北京" 满足) ,则选择 "与" 关系。 3. 开头或结尾匹配筛选 使用场景:当你关注数据的开头或结尾字符时,可以使用此类筛选。 操作示例:在 "city" 列筛选城市名以 "宝" 开头的城市,在自定义筛选条件框中选择 "开头是",并输入 "宝";若要筛选城市名以 "州" 结尾的城市,则选择 "结尾是",输入 "州"。 数字筛选中的高级用法 1. 区间筛选 使用场景:在处理数值型数据(如销售额、年龄等)时,需要筛选出某个数值区间内的数据。 操作示例:假设有一列是游客的消费金额数据,要筛选出消费金额在 500 - 1000 元之间的数据。在自定义筛选中,第一行条件选择 "大于或等于",输入 "500",第二行条件选择 "小于或等于",输入 "1000",并选择 "与" 关系。 2. 基于平均值、最大值、最小值的筛选 使用场景:当你需要根据数据的统计特征进行筛选时,这种方法很有效。 操作示例:对于游客的年龄数据,先计算出平均年龄,然后在自定义筛选中选择 "大于" 或 "小于",并输入平均年龄值,筛选出年龄大于或小于平均值的游客数据;或者筛选出年龄大于最大年龄减 10 的数据,即选择 "大于",并通过公式计算出 "最大值 - 10" 的结果后输入(如果数据量较大,可借助函数如 MAX 计算最大值 )。 3. 前 N 项筛选 使用场景:在处理排名或关注 top 数据时使用。 操作示例:对于游客消费金额数据,要筛选出消费金额最高的前 10 位游客。在自定义筛选中,选择 "10 个最大的值",然后在弹出的对话框中,将 "10" 修改为你需要的数值,如 "5",即可筛选出消费金额最高的前 5 位游客数据。 三、日期筛选中的高级用法 1. 基于时间段的筛选 使用场景:当你需要筛选出特定时间段内的日期数据时,如筛选出某一年、某一季度或某几个月的数据。 操作示例:在 "date" 列筛选 2023 年的数据,在自定义筛选中,第一行条件选择 "大于或等于",输入 "2023 - 01 - 01",第二行条件选择 "小于或等于",输入 "2023 - 12 - 31",并选择 "与" 关系;若要筛选出 2023 年第二季度的数据,输入 "2023 - 04 - 01" 和 "2023 - 06 - 30"。 2. 相对日期筛选 使用场景:根据当前日期或某个固定日期的相对时间进行筛选,如筛选出过去 30 天内的数据、未来一周的数据等。 操作示例:假设当前日期是 2024 - 05 - 01,要筛选出过去 30 天内的旅游订单日期数据。在自定义筛选中,选择 "大于",输入 "=TODAY () - 30"(TODAY () 是 Excel 中的日期函数,返回当前日期),即可筛选出从 2024 - 04 - 01 到 2024 - 05 - 01 的数据。 列表搜索 在搜索框输入关键词,能快速筛选出该列中包含该关键词的数据项,方便在大量数据中查找特定内容。 全选 / 取消全选:"全选" 勾选后,该列所有数据项被选中,显示对应数据行;"取消全选" 取消勾选后,该列所有数据项不被选中,可重新选择需要的数据项。 数据项列表:列出该列所有不同数据项,通过勾选或取消勾选特定数据项,可筛选出包含这些数据项的行,精准控制显示的数据内容。 二、排序功能 在排序面板中,支持设置多条件排序规则: 添加 / 删除 / 复制条件:点击 "添加条件",可新增排序条件,实现多列数据的组合排序,比如先按 "tourist_attraction" 列排序,再添加 "city" 列作为次要排序条件,满足复杂排序需求;"删除条件" 可移除已添加的排序条件,方便调整规则;"复制条件" 能快速复制已有排序条件,减少重复操作。 排序规则设置区域:通过 "列(主要关键字)" 下拉菜单,可选择要排序的列,如图中选择 "tourist_attraction" 列,依据数据中的不同列确定排序字段;"排序依据" 选择 "数值",表示按列中数据的数值大小排序,此外还支持按 "单元格颜色""字体颜色""单元格图标" 等排序,满足对数据多种属性的排序需求;"次序" 选择 "升序",即按从小到大(数值)或从 A 到 Z(文本)的顺序排列数据,也可选择 "降序" 实现反向排列。 选项按钮:点击后进入更详细的排序设置界面,可设置排序时是否区分大小写(针对文本数据)、排序方向(按行或按列)等,进一步细化排序规则。 而除了上述提到的功能,SpreadJS还提供了一些扩展的能力。 三、扩展功能 中文拼音首字母排序。 function compareSize(value1, value2) { return value1.toString().localeCompare(value2.toString(), "zh"); } sheet.bind(GC.Spread.Sheets.Events.RangeSorting, function (e, info) { // 可以根据 info.range 判断是否是需要处理的范围 info.compareFunction = compareSize; }); 通过上述的代码,监听排序操作,使其按照中文拼音首字母排序。 自动扩展筛选区域 当创建一个筛选并且只选择一个单元格时,SpreadJS 将扩展筛选区域,直到区域周围的单元格都是空的。 创建筛选后,SpreadJS 将筛选区域扩展到原始值以下,直到出现空值。 四、示例 下面通过两个示例,看看如何运用这些筛选排序功能: 示例一:高学历游客线上支付偏好与景区关联分析 筛选操作: 对 "education" 列进行文本筛选,勾选 "本科""硕士及以上" 等学历选项,筛选出高学历游客相关数据。 对 "pay_meth" 列进行筛选,勾选 "线上团购""支付宝" 等线上支付方式选项。 排序操作: 以 "tourist_attraction" 为主要关键字,设置 "数值" 排序依据,选择 "升序",使景区按序排列。 添加 "pay_meth" 为次要关键字,同样 "数值" 升序,让同一景区内不同支付方式也有序呈现。 分析目的:通过筛选排序,能清晰呈现高学历游客在不同景区的线上支付偏好,助力景区针对高学历游客优化线上支付服务与营销,比如在高学历游客青睐的景区,加大线上支付优惠活动推广。 示例二:优质景区境外游客交通方式分析 筛选操作: 对 "level" 列进行筛选,勾选 "4A""5A" 等级选项,聚焦优质景区数据。 对 "visitor_ty" 列进行文本筛选,筛选出 "华侨""外国人" 等境外游客相关数据。 排序操作: 以 "level" 为主要关键字,"数值" 升序(或降序,依查看习惯),将景区按等级排序。 添加 "transport" 为次要关键字,"数值" 升序,让同一等级景区内的交通方式有序展示。 分析目的:操作后,可直观了解优质景区中境外游客的主要交通方式,景区可据此在交通枢纽处(如对应交通方式站点)设置景区专属服务点,或与交通运营方合作推出针对境外游客的交通 + 景区游览套餐。 示例三:景区淡旺季与游客消费及折扣关联的高级分析 筛选操作: 利用文本筛选功能,对 "date" 列设置 "自定义筛选",筛选出每年 1 - 3 月(淡季)和 7 - 8 月(旺季)的数据。 结合多列筛选,同时对 "pay_meth" 列筛选出 "线下团购""线上团购""现金" 等主要消费支付方式,对 "discount" 列筛选出折扣为 0、0.6、0.85、0.9 等不同折扣区间的数据。 排序操作: 采用多条件优先级排序,首先以 "date" 为主要关键字,"数值" 升序,将淡季和旺季数据依次排列。 添加 "discount" 为次要关键字,"数值" 降序,让同一时间段内高折扣数据优先显示。 再添加 "pay_meth" 为第三关键字,"数值" 升序,使相同折扣下不同支付方式有序呈现。 高级功能运用及分析目的: 借助 SpreadJS 的单元格级权限管控,可设置仅相关市场分析人员能查看和编辑此筛选排序后的数据,保障数据安全。同时利用协同编辑功能,团队成员能在线共同对数据进行标注、补充分析思路。通过这样的高级筛选排序,能深入剖析景区淡旺季不同折扣策略下游客的消费支付偏好,为景区在淡旺季制定更精准的营销与价格策略提供数据支撑,比如旺季可针对高折扣且热门的支付方式推出组合优惠,淡季则通过特定支付方式的折扣活动吸引游客。 无论是日常办公中对数据的基础处理,还是企业级多源海量数据的深度分析,SpreadJS 都以其类 Excel 的友好操作与强大拓展能力,为数据筛选排序工作带来高效与便捷,成为数据处理领域的得力助手。 体验地址 SpreadJS在线表格编辑器

优秀的个人博客,低调大师

告别App 中国移动5G消息上线数字人民币钱包

近日,中国移动宣布将于5G信息中添加“数字人民币”钱包功能,用户可以直接从5G信息界面中完成包括查询余额、交易记录向他人转账等等操作,省去了还要在应用商店下载App的繁琐操作。 所谓“5G信息”,可以说是无端的5G应用,它与现有的即时聊天软件有所不同,可以让手机号成为5G消息的用户ID,无需添加好友,无需注册,无需安装App,即可发送支持发送文本、图片、音视频、地理位置等丰富消息。 5G信息不需要下载App就能支持多款应用功能据悉,数字人民币与 5G 消息融合为用户提供了便捷易用的社交支付能力,为数字人民币的快速推广提供了有力支撑。另外,在风险防控方面,数字人民币钱包交互内容采取加密方式传输,能够更好地防范消息传输风险,有效守护客户的信息和资金安全,未来的交易方式甚至可能完全“去App化”。 9月29日,中国联通产品中心副总经理黄昌建表示,目前中国联通的5G消息全国运营平台已经完成,传统短信、数字短信和5G消息的能力已经集约化起来。5G消息可能会在10月中下旬全国试商用。

优秀的个人博客,低调大师

Tapdata 唐建法:是时候告别ESB和MQ了, 不妨这样“实时”打通数据孤岛

数据孤岛已成企业数字化转型“绊脚石”。 早期系统设计,不考虑数据互通,传统的 ERP、OA、CRM……每个系统都是独立的,不同架构之间具有天然的层级,数据库也多为单体式,在数据指数级增长的今天,陷入性能无法扩展的窘境,数据孤岛问题对企业而言将会“越来越痛”。 如何从根本上解决数据孤岛问题? 近年来行业有着各种各样的尝试,比如数仓、大数据平台、数据中台等几代数据工具和架构,但似乎一直没有找到最佳方案。 原因是,以 Teradata、Vertica 和 Greenplum 为代表的数仓基于 MPP 架构,拓展性较差,跨节点关联计算瓶颈明显,而且不支持半结构化和非结构化数据;基于 Hadoop 架构的数据湖、大数据平台由于是开放式架构,横向扩展性强,能以原始格式存储数据而无需对数据进行结构化处理,近期数据中台更是一片火热,但它们的技术底层仍然以大数据平台的技术为基础,更多只是一种企业管理理念的创新。 在唐建法(TJ)看来,当前大热的主流数据中台解决方案仍存在不少误区: 贪大求全:产品化体验不容易达到,需要大量人力堆砌; 数据业务化走的太远:各种地产中台、营销中台、金融中台...... 已经越来越脱离数据; 几乎都是基于 Hadoop 大数据底层,以离线数据为主:支持的核心业务场景更偏向 BI 报表、各种数据分析等 OLAP 场景,重在对历史数据做洞察和分析。 TJ 强调:回归数据本质。 “为新业务提供统一、完整、实时的数据,并且支持十万级并发和毫秒级响应,能够完美支撑 TP+AP 业务” 才是新时代打通数据孤岛方案的标配。这也正是 Tapdata 在做的事情——打造一个“务实”的实时数据服务平台。所谓“务实”,包括: 聚焦于数据,承担“采集,融合,治理,建模,质量,安全”等核心职责,将“洞察画像,推荐,AI引擎,营销引擎,大屏可视化”等非核心职责由下游业务系统完成。 能够提供离线和“真实时”数据处理能力,即全链路实时:实时获取数据 + 实时处理 + 实时服务,在支撑 AP 型业务基础之上,更能支持 TP 型业务或场景。 通过 Tapdata 实时数据服务平台“实时”打通数据孤岛,从而支撑全渠道业务(OLTP + OLAP): 实时采集融合——建立统一数据平台 实时处理——构建数据资产(模型) 实时服务——支持上层应用业务 无论企业现在有多少个业务系统,用了多少个不同的数据库,Tapdata 实时数据服务平台能以一种无痛接入的方式,使用基于日志同步的数据虚拟化技术,为企业构建一个虚拟、统一的数据访问层。如此一来,企业需要数据的时候只需要到一个中央化的地方,通过Tapdata 提供的标准化接口(tap),就可以简单方便地获取到想要的数据,就像打开自来水龙头取水一样简单。 要实现这一目标看似简单,实则困难重重。比如:实时数据同步的可靠性、反向更新问题,还要考虑各种异构库的同步问题等。 考虑到降低客户建设成本、长期运维成本和学习曲线,Tapdata 率先采用数据即服务(Data as a Service,简称 DaaS)架构理念,没有使用主流的类似 Flink 或者 Kafka 这样的大数据技术,而是自研数据虚拟化技术,相比传统的联邦查询方式,基于同步的虚拟化对技术要求更高,容错性更低,毕竟需要对各种底层实现完全不同的数据库进行事务级别的日志解析,忠实还原并在亚秒级延迟下重放到 DaaS 平台。这个架构没有捷径,Tapdata 经过大量的实战研发,并且在不断优化实现和算法的基础上,形成了技术壁垒,能够安全可靠的将源系统数据无需其他ETL工具,就可以实时镜像到 DaaS 平台,并提供准确的数据服务。 Tapdata 的异构数据源统一访问框架通过定义一个支持绝大部分数据库的标准,从统一的URL连接方式,到富结构的数据模型,到标准的DML和DDL,来为具有多源异构数据库的企业用户提供一个简单、一致的数据访问能力。只需要一种语法,就可以对企业所有数据进行浏览查看,甚至简单的更新管理。 从此,用户无需再做多种存储方案,解决元数据、搜索、缓存、队列等问题,只需使用 Tapdata 实时数据服务平台,就拥有了一个架构简单,部署轻量,低成本和上手快的 DaaS 平台,可为业务应用及大部分数仓、大数据平台和中台建设提供最完整、统一、准确的实时源数据。 Tapdata 秉承开源精神,为开发者服务。目前已通过云上开放的方式( http://cloud.tapdata.net ) ,将异构数据库实时同步能力免费提供给开发者使用,虽然,Tapdata Cloud 还只是 Tapdata 的一小部分功能,但已具备独立完成多达十几种数据库的异构数据同步能力,为新业务扩展,缓存加速, 全文检索,数据库备份容灾等很多新型业务场景提供生产级的支撑,后续会逐步将 Tapdata 的所有能力迁移上云。随着 Tapdata 完成数千万美元 Pre-A 轮融资,将进一步加大研发投入,并适时对核心能力进行开源。 申请试用 Tapdata 实时数据服务平台和了解更多信息 https://tapdata.net/

优秀的个人博客,低调大师

苹果iPadOS 15特性汇总:生产力表现提升 告别“买后爱奇艺”

6月8日凌晨,苹果WWDC21如期发布,其中iPadOS也迎来了自己的全新版本iPadOS15。 苹果在发布会中提到,依托iPdaOS构建的各项独特功能,才令iPad有了独一无二的移动能力和触控表现。 全新升级的iPadOS15也将会使iPad的功能更加丰富强大。 自由奔放的组件排列 今年的iPadOS15将在主屏幕交互上有重大升级,支持小组件和单个应用混合排列,使用者可以按照自己的喜好,随意组合屏幕上的顺序排列,做到极具个性化。 此外苹果还推出了一些适应iPad大屏的小组件,轻轻一扫,即可随意切换影音、游戏和照片等不同类型主页,做到高效流畅交互。 高效整理的应用资源库 为了方便使用者轻松找到不常用的应用,此前的iPadOS 15效仿iOS也推出了iPad的应用资源库。 所有应用都能在应用资源库中轻松找到,使用逻辑和iPhone的应用资源库使用基本一致,但iPadOS上的这个应用资源库可以做到随时从程序坞直接上拉使用,这一点上来说,比iOS的应用资源库更胜一筹。 简单快捷的多任务管理 多任务管理也是iPadOS15的升级亮点之一,相比之前复杂繁琐的分屏操作,此次的iPadOS15新增了分屏控件,在上方拉出即可使用,轻点分屏按钮,之前打开的应用便可向伸缩至屏幕边缘。 这时,我们可以随意的在主屏幕上进行操作,然后再次点按第二款应用时,两个应用就能自动分屏占据整个屏幕,如果想要更换分屏的应用,只需要将不需要的应用下即可。 同时,在分屏的情况下,还支持部分应用的小窗模式打开,比如发布会中演示的邮件应用就是如此。 应用架还支持部分应用的暂存管理,而且支持随意组合分屏,想要选择那款应用,上滑应用架选择即可,非常的方便。 更为强大的备忘录 备忘录作为iPad的核心应用,它的升级直接影响了iPad整体的生产力。 对此,苹果推出了QuickNote,意为全系统快捷备忘录,而启动它也十分方便,只需要拿着ApplePencil从iPad屏幕的角落边缘轻扫,即可打开QuickNote,当我们用完的时候,下拉回去即可。 不仅如此,QuickNote还支持应用识别,可以识别系统和部分第三方应用的链接,需要什么链接和笔记,在QuickNote上直接搞定。 覆盖全局的翻译系统 在iPhone中备受好评的翻译这次也随iPadOS15来到了iPad中,不仅支持实时语音自动翻译,而且全系统所有文本均可以翻译,连照片上的实体文字也照样可以翻译无误。 首次搭载的编译功能 SwiftPlaygrounds作为学习代码的绝佳方式,寓教于乐,深受代码初学者的喜好,在iPadOS15中,iPad的编译功能得以增强,开发者可以在iPad上轻松完成开发。 总结 整体来看,iPadOS15的升级亮点也不少,整体上的提升和生产力都有关,娱乐影音这块,今年好像是没有什么提升,这也表示了苹果对iPad这条产品线的重新定位,期待iPadOS15的后续更新。

优秀的个人博客,低调大师

程序员如何告别无聊?何不创建一些有趣的东西呢?

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 是时候摆脱那些让你厌烦的无聊项目啦。你一定也有很多天马行空的奇思妙想,想要创建一些刺激且有趣的业余项目,但却不确定如何进行。 没关系,本文带着你“找找刺激”! 提高技能的最好方法就是实践。这些有趣又有挑战性的项目是你的最佳选择。 1. 数独 数独游戏大家都不会陌生吧,这些有趣的谜题也是获得算法经验的好方法。本项目的需求是创建一种算法,可用于生成有效的数独游戏。 如果你觉得这太简单了,还可以构建一种算法来解决这些数独游戏。可以执行此操作的一种方法是创建回溯算法。 你可以从中可学到: 学习和实现数独算法 为数独游戏增加一些难度,获得更大成就感 2. 目录应用 如今,创建目录已不再稀奇。但是,这个项目却不同,它可以使用Flutter来运行。Flutter是Google最新的UI工具包,可仅使用一个代码库创建本机移动应用程序。它使用Dart编程语言。最近Flutter可是很火呢! 你可以从中可学到: Flutter Dart编程语言 应用开发 3. 渐进式Web应用 渐进式Web应用程序很热门。由于控制渐进式网络应用程序的范围非常容易,因此这也非常适合作为业余项目创建。 计划构建渐进式Web应用程序时,可以选择Angular、React、Vue等顶级JavaScript框架中的一个,将其结合起来。最好对这些框架进行一些研究,然后选择最喜欢的框架。这样你将获得最佳的学习体验。 你可以从中可学到: 使网络应用逐步发展所需的一切 选择的JavaScript框架 Web开发基础,例如HTML和CSS 4. 自动驾驶乐高车 几年前,我从事过类似的项目,被要求制造一辆由乐高拼成的汽车,该汽车可以在纸上写出某个特定的单词。 该项目旨在使用乐高或乐高技术制造一辆行驶中不会撞到任何物体的汽车。需要用到树莓派Raspberry Pi(或Arduino)、一些乐高玩具和超声波传感器,以避免出现任何障碍。 本项目最有趣的地方就是软件和硬件的结合。如果有人从未接触过树莓派Raspberry Pi(或Arduino),强烈推荐做下这类项目。 你可以从中可学到: Arduino(或Raspberry Pi)的基本用法。 读数传感器。 软件和硬件之间的交互。 5. 汽车分类 聚类和分类是机器学习的一部分。本项目旨在根据汽车有关数据将汽车分类为安全或不安全。这个项目是了解机器学习全部知识的好方法,所需要做的就是数据集。 你可以从中可学到: 掌握机器学习 分析数据 6. 2D游戏 如果一直有尝试游戏开发的想法,那么创建2D游戏绝对是个不错的开始,这将极大地提高编程技能。 你不必为游戏创新而冥思苦想,最好的入门项目就是重建Flappy Bird,无论是在移动设备上还是台式机上都可操作。也可以自己制作游戏,但要记住从小游戏做起。 你可以从中可学到: 实体的运动 横向滚动 碰撞检测 7. 大数据 如果对大数据项目感兴趣,那绝对应该尝试使用芝加哥犯罪数据集。这是一个多分类问题,对于经验丰富的数据科学家来说非常有用。这个问题很容易,但是由于该数据集有超过600万个观测值,所以数据管理异常困难。 你可以从中可学到: 大数据方面知识,例如数据建模 处理大数据集 从列表中选择最有趣的那个,然后开始上手。相信你一定能从中收获良多! 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/live 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-06-07本文作者:读芯术本文来自:“读芯术公众号”,了解相关信息可以关注“读芯术”

优秀的个人博客,低调大师

告别繁琐提升效率,Docker 帮您降低从开发到部署的复杂性

出品丨Docker公司(ID:docker-cn)编译丨小东每周一、三、五晚6点10分 与您不见不散! 在 Mobelux,开发项目永远不会停止。我们一直在研究新的和现有的代码库。无论何时,都有多个版本的 Python、Ruby、NodeJS、PostgreSQL、MongoDB 和 Elasticsearch 投入使用。 在这些不同的环境中运行我们的代码,同时确保每个开发和测试环境都配置了正确版本的软件和守护进程是一件非常痛苦的事情。所有这些可移动的部分都可能破坏生产环境部署的一致性。 为了简化开发和部署,我们开始使用 Docker 和 Docker Compose,它们让我们的工作变得更加轻松。 Docker 的基础介绍 如果这是你第一次听到 Docker,那么我会为您概述它是如何工作的。 Docker 让您以一种一致的、可重复的方式快速、轻松地设置复杂环境。它为您的软件提供了一个称为容器的小型隔离环境,该环境完全独立于运行在您的计算机或其他容器上的其他软件。 然后,您可以将这些容器配置为任何操作系统并安装任何必要的软件,从而可以轻松配置特定于应用程序的需求,而不会影响可能存在冲突需求的其他软件。它在很多方面类似于虚拟机(对于那些熟悉该技术的人而言),但运行的系统资源要少得多。 每个 Docker 容器都是 Docker 镜像的执行实例 —— 一个预构建的定义,内置所有软件和配置,因此它在任何地方运行都完全相同。镜像本身是由一个名为 Dockerfile 的文本文件所构建的,该文件包含一个简单的命令列表,并且可以在必要时不断重建。 这意味着一旦创建了 Dockerfile 文件,任何用户都可以通过它快速构建镜像并运行预先配置了正确软件的容器。您还可以预先构建和发布镜像,以节省更多时间。 您可能知道,大多数的 Web 应用程序和 API 不仅仅只包含一个应用程序。它们使用在其他服务器上运行的数据库、缓存和其他 Web 服务。Docker Compose 是一个与 Docker 一起发布的工具,预装了 Docker for Mac 和 Docker for Windows,它可以让您定义一组容器,这些容器可以一起启动并在专用网络上运行。这样,您就可以在一个本地的、隔离的、自动配置的环境中模拟整个应用栈了。 使用 Docker 进行开发 当您在传统的 Web 平台开发环境中工作时,开发人员必须配置许多内容,并随着平台的发展使它们保持同步。首先,必须安装正确的环境(例如特定的Python、Ruby 或 NodeJS 版本)。仅此一项可能非常耗时,容易出错,并且对于刚接触生态系统的人来说需要处理很多事情,特别是当您添加用于隔离环境的工具和多个项目的库存在于同一台机器上时。 接下来,开发人员需要确保他们拥有正确版本的外部服务,例如数据库和缓存。如果您正在处理多个项目,则可能需要多个版本,并且您必须将它们与您在生产中所使用的任何版本保持同步。每个项目还可能需要任意数量的开发库和系统工具来正确构建和运行。如果没有什么工具可以帮助您,那么整个事情就会变得极其困难和耗费时间。 Docker 就是那个可以拯救您的工具! 使用 Docker,我们只需配置一次,然后将其作为 Docker 镜像发布。当开发人员在同一个项目上工作时,他们会下载最新的镜像,或从项目的 Dockerfile 文件中重建它。它将自动安装所有软件依赖项的正确版本,这样我们就可以确保一切都是正确的和最新的。 通过使用 Docker Compose,我们可以更进一步为正确的数据库、缓存、搜索引擎甚至 Amazon S3 克隆配置镜像和容器。我们配置这些组合栈,以便在开始时启动所有服务,将当前代码的本地副本安装到开发容器中,以便开发人员可以使用其主操作系统的本机代码编辑器和工具,并为开发人员提供命令能够安装任何特定于发行版本的依赖项并运行开发代码。 这节省了我们配置系统和调试配置问题的工作时间。首次设置环境只需要几分钟(甚至几秒)而不是几小时。 作为额外的好处,在整个项目生命周期中的 Bug 数会减少,因为开发人员使用相同的库、基本操作系统和用于运行生产系统的外部服务。任何这些服务和依赖项的更新也可以在本地轻松测试,因此您可以确保它们按预期工作。 使用 Docker 进行测试 在开发测试之后,Docker 仍然是首选工具,它让整个流程变得更简单、更精确。 所有与开发相关的挑战仍然存在于测试中,甚至当不是所有的测试人员都来自于开发或高技术背景时,这种情况会变得更加复杂。Docker 为管理这种复杂性提供了几种不同的选择。 开发人员可以为 docker 镜像提供已经在镜像中的代码的正确版本。通过这种方式,测试人员不需要与版本控制或检查进行交互,以确保他们在本地拥有正确版本的代码。然后 Docker Compose 可用于使用该镜像运行容器以及外部服务的容器,因此他们只需简单地运行 Docker Compose 堆栈,一切都在那里。 如果我们确实需要从版本控制中测试特定代码,那么测试人员仍然可以通过克隆 git 镜像仓库并将其安装到正在运行的容器中,类似于开发过程。不同之处在于,具有需要测试的代码的容器不是转到命令行,而是自动安装当前的依赖项,用基本的测试数据为数据库提供种子,并自动运行该服务。 为了使它更简单,我们一直在使用一个名为 Lifeboat 的工具 —— 一个简单的用于 Docker Compose 的 GUI 和 GitHub Desktop。这使得测试人员可以轻松地启动和停止撰写堆栈,而无需在项目之间导航或在命令行上管理 Docker 和 git。 使用 Docker 进行部署 最后是部署时间,Docker 继续依旧让事情变得更容易。 在传统的服务器部署中,每个服务器必须在部署时手动更新依赖关系。对于使用 Python 或 Ruby 等语言构建的大多数现代 Web 平台,这意味着要联系外部服务器以下载这些依赖项,并且在某些情况下,每次都要编译它们。每次发生这种情况时,都会有存在失败的风险 —— 特别是考虑到服务器操作系统可能与开发或测试发生的地点不同。 在使用Docker时,这些风险会降低或消除。我们首先创建一个镜像并将其部署到 staging,以确保它按预期构建、部署和运行。然后将这个完全相同的镜像(已安装和配置了所有依赖项)部署到生产中,从而消除以前在部署期间出现故障的机会。 从开发到部署,Docker 使开发人员的工作变得更加轻松。我强烈建议大家尝试一下。

优秀的个人博客,低调大师

云计算正在告别DIY时代 阿里云专有云挑起企业级市场大梁

“云计算的DIY时代已经过去”,5月23日在2018云栖大会·武汉峰会上,阿里云专有云事业部总经理马劲表示,DIY式私有云正被时代抛弃,不仅部署费时费力,且难以解决企业云的顽疾。取而代之的是被验证过的公共云架构,这成为企业云平台新标准。 而针对困扰客户的“数据孤岛”、“烟囱式应用”、“割裂的跨部门协作”等问题。阿里云推出了基于专有公共云与“中台架构”的整体解决方案。以真正的云与真正解决客户困境的互联网架构开启企业以云来推进数字化转型的最佳实践。 云计算的DIY时代已经过去 此前,“自主可控的飞天云”与“拿来主义云”成为行业讨论焦点,而当日的武汉峰会上阿里云总裁胡晓明再次提出“拿来主义云盖不出高楼大厦,自主研发的云才能走得更远”。 在实践中,“拿来主义云”很快暴露出没有真正掌握核心技术所带来的种种问题。比如,没有经历大规模的实战检验,稳定性

优秀的个人博客,低调大师

人工智能让你告别打码时代

像人类一样,机器也能识别模糊的面部图像——而且更快 得克萨斯大学和康奈尔科技学院的研究人员称,打码(像素化图像)是模糊身份的狡猾方式,但计算机可被训练得能识别出这些“被保护”的人。 如果攻击者有一套清晰的照片可供练习,被像素化模糊的部分便昭然若揭。只要人工智能(AI)也能有相应的清晰照片集用以训练,面部马赛克作为匿名机制这种事还是让它飘散在风中吧。 听起来似乎没什么大用——人类也能做到同样的事情,但由于计算机化了,便可以自动执行,也就是说可以日夜不停,快速进行。 arXiv科学论文电子预印本库中的一篇论文( http://arxiv.org/pdf/1609.00408v1.pdf )称,像素化(拼接)、模糊(如YouTube上用的一样),甚至加密JPEG系数(被称为P3的机制:“隐私保护照片共享”),也挡不住恢复被保护的图像。 他们认为,人工神经网络可被训练来成功识别人脸、物体和手写签名,即使这些图像用上述模糊技术处理过。基于不同数据集合不同模糊类型,成功率在50%到95%之间。 他们的AI不需要人类来指出重要特征。不仅不需要预先指定相关特性,也不用知道部分加密或模糊化的图像泄露出来的究竟是什么。神经网络会自动发现相关特性,并学会利用隐藏和可见部分之间的联系。 处理照片中唯一的难点,在于攻击者需要巡游社交媒体,搜罗可能出现在给定照片中的可能人脸集合。但对于明星或公众人物来说,这都不是事。 同样的方法,适用于恢复被模糊化了的文本或手写文字,只要攻击者能找到训练数据集(就像图像识别模型的基准一样存在于网上)。该论文还描述了用于训练此模型的神经网络架构,可供意图更好地保护图像隐私的开发者当做参考基准。 本文转自d1net(转载)

优秀的个人博客,低调大师

告别提示词工程,「上下文工程」才是 AI Agent 的核心竞争力

编者按: 什么样的技能才能真正决定 AI 智能体的成败?是更复杂的算法,还是更精妙的提示词?我们今天为大家带来的文章,作者的观点是:构建强大 AI 智能体的关键已从"提示词工程"转向"上下文工程"。 文章从"上下文"的广义定义出发,详细拆解了影响 AI 决策的七大关键要素,包括系统指令、用户输入、历史对话、长期记忆、外部检索信息、可用工具及输出结构。通过对比"廉价演示项目"与"神奇智能体"的案例,作者生动展现了上下文质量如何决定 AI 的表现 ------ 真正的差距不在于模型本身,而在于是否提供了恰当的上下文支持。作者进一步提出,上下文工程是一套动态流程,需跨领域协作,以结构化的方式整合业务需求与技术实现,确保 LLM 在正确的时间获得正确的信息与工具。 作者 | Philipp Schmid 编译 | 岳扬 上下文工程(Context Engineering)是一个在人工智能领域逐渐走红的新术语。行业内讨论的焦点正从"提示词工程"(prompt engineering)转向一个更广泛、更强大的概念:上下文工程(Context Engineering)。托比·卢克(Tobi Lutke)[1]将其描述为"为任务提供完整的上下文背景,使大语言模型能够合理解决问题的一门艺术",他说得很到位。 随着 Agents 的兴起,将哪些信息输入"有限的工作记忆(limited working memory)"中变得越来越重要。我们观察到,决定一个 Agent 成败的关键因素,通常就在于你提供给它的上下文质量。大多数 Agent 的失败早已不是模型本身的问题,而恰恰是上下文供给的失败。 01 什么是上下文(Context)? 要理解上下文工程(Context Engineering),我们首先必须扩展对"上下文"的定义。它不仅指你发送给 LLM 的单一提示词(prompt)。应该将其视为模型在生成响应前所看到的一切信息。 指令 / 系统提示词(Instructions / System Prompt) : 用于定义模型在对话期间行为的初始指令集,可以/应该包含示例、规则等。 用户提示词(User Prompt) : 来自用户的即时任务或问题。 状态 / 历史(短期记忆)[State / History (short-term Memory] : 当前的对话内容,包括导致此刻结果的"用户与模型的历史回复"。 长期记忆(Long-Term Memory) : 在之前的多次对话中收集的持久性知识库,包含学习到的用户偏好、过往对话摘要、或被明确告知需要记忆以备后续使用的信息。 检索信息(RAG)[Retrieved Information (RAG)] : 外部的、最新的知识,来自文档、数据库或 API 的相关信息,用于回答特定问题。 可用工具(Available Tools) : 所有可调用函数或内置工具的标准化描述(如输入参数、输出格式、功能说明)(例如 check_inventory, send_email)。 结构化输出(Structured Output) : 对模型响应格式的定义,例如一个 JSON 对象。 02 为什么重要?从「廉价的演示项目」到「神奇的智能体产品」 构建真正高效的 AI 智能体的秘诀,与你编写代码的复杂程度关系不大,而与你提供上下文的质量息息相关。 构建智能体,与你编写的代码或使用的框架关系不大。 一个廉价的演示项目和"神奇的智能体"之间的区别,就在于你所提供上下文的质量。假设让一个 AI 助手根据一封简单的邮件来安排会议: Hey, just checking if you're around for a quick sync tomorrow. 嘿,想问一问明天方不方便,我们快速碰个头? "廉价的智能体演示项目"的上下文质量很差。它只看到用户的请求,其他什么都看不到。它的代码可能功能完善,它会调用 LLM 并获得响应,但输出的内容却毫无帮助,且充满机械感: Thank you for your message. Tomorrow works for me. May I ask what time you had in mind? 感谢来信!明天我有空。你想约在几点? "神奇的智能体"则由丰富的上下文驱动。其代码的主要任务并非琢磨如何回应,而是收集 LLM 所需的信息,以便更好地响应用户需求。在调用 LLM 之前,你可以扩展上下文,使其包含: 你的日历信息(显示你日程已满)。 你与此人的过往邮件(用于确定合适的非正式语气)。 你的联系人列表(用于识别 ta 为关键的合作伙伴)。 send_invite 或 send_email 工具。 然后便能生成回应: Hey Jim! Tomorrow's packed on my end, back-to-back all day. Thursday AM free if that works for you? Sent an invite, lmk if it works. 嗨 Jim!明天我这边日程全排满了,从早到晚连轴转。周四上午有空,你看行不?邀请已发,确认下是否合适~ 这种神奇的效果并非源于更聪明的模型或更精巧的算法,而在于为正确的任务提供了恰当的上下文。这就是为什么上下文工程(Context Engineering)非常重要。智能体的失败并非仅仅是模型的失败,本质上是上下文的缺失。 03 从提示词工程到上下文工程 什么是上下文工程?如果说"提示词工程(prompt engineering)"侧重于在单个文本字符串中精心设计一套完美的指令,那么上下文工程(context engineering)的范畴则宽广得多。简而言之: 上下文工程是一门设计和构建动态系统的学科,它能以正确的格式、在正确的时间提供正确的信息与工具,赋予 LLM 完成任务所需的一切资源。 上下文工程是 一套流程,而非某些字符串:上下文不仅是一个静态的提示词模板。它是主 LLM 调用前系统运行所产生的输出。 动态构建的:随任务即时生成,适配用户当下的需求。对某个请求,其上下文可能是日历数据,对另一请求,上下文则可能是邮件记录或网页搜索结果。 在正确的时间提供正确的信息和工具:其核心职责是确保模型不遗漏关键细节(Garbage In, Garbage Out)。这意味着只有在必需且有帮助时才提供知识(信息)与能力(工具)。 注重呈现格式:如何呈现信息很重要。简明扼要的摘要胜过原始数据的堆砌,清晰的工具架构胜过模糊的指令。 04 Summary 构建强大且可靠的 AI 智能体,已经不再需要寻找神奇的提示词或更新模型版本。其核心在于上下文工程,即以正确的格式、在正确的时间提供正确的信息与工具。这是一项跨领域协作的挑战,需要理解业务场景、定义预期输出,并结构化组织所有必要的信息,使 LLM 能够真正"完成任务"。 05 致谢 本综述的完成得益于深度研究(deep research)与人工校验(manual research),并从以下优质资源中汲取了灵感与信息: Tobi Lutke tweet[1] Karpathy tweet[2] The rise of "context engineering"[3] Own your context window[4] Context Engineering by Simon Willison[5] Context Engineering for Agents[6] END 本期互动内容 🍻 ❓你是否有过动态构建上下文的经验?能否分享一个你认为特别成功的案例? 文中链接 [1]https://x.com/tobi/status/1935533422589399127 [2]https://x.com/karpathy/status/1937902205765607626 [3]https://blog.langchain.com/the-rise-of-context-engineering/ [4]https://github.com/humanlayer/12-factor-agents/blob/main/content/factor-03-own-your-context-window.md [5]https://simonwillison.net/2025/Jun/27/context-engineering/ [6]https://rlancemartin.github.io/2025/06/23/context_engineering/ 本文经原作者授权,由 Baihai IDP 编译。如需转载译文,请联系获取授权。 原文链接: https://www.philschmid.de/context-engineering

优秀的个人博客,低调大师

🔥 Solon AI + MCP 实战:5 行代码搞定天气查询,LLM 从此告别数据孤岛

此文参考自:https://www.toutiao.com/article/7505712149642117669/ 一、痛点直击:为什么你的AI模型会“一问三不知”? 当你问 AI “杭州今天会下雨吗”,早期的 AI 应用会回答“请搜索网络”(大概这么个意思)。传统 AI 开发需要为每个工具单独开发接口(如天气API、股票数据、本地文件系统),每对接一个数据源需耗费开发者3-5天时间,且存在以下问题: 重复开发:不同的 AI 应用需各自对接同一套工具(比如对接高德地图接口) 动态能力缺失:无法实时调用最新数据(如每分钟变化的股价) 生态碎片化:不同厂商工具接口互不兼容 技术门槛量化:若企业需对接10个外部工具,传统方案需投入至少10人天,而通过MCP协议可缩短至1人天,效率提升10倍。 二、技术破局:MCP协议如何成为AI世界的“万能插座”? MCP(Model Context Protocol)由 Anthropic 提出,其核心价值在于: 统一接口:像 USB-C 协议统一外设接入,MCP 为 AI 定义标准化的工具调用规范 动态感知:支持多轮对话中实时调用外部资源(如天气API、数据库) 安全隔离:通过本地服务处理敏感数据,避免直接暴露API密钥 技术架构对比 传统方案 MCP方案 每个模型独立对接工具 一次开发,所有MCP兼容模型通用 手动处理HTTP请求/响应 声明式工具描述自动映射 无状态会话 支持会话ID恢复上下文 三、实战教学:5行代码构建天气预报MCP服务 场景设定 为旅游规划AI助手提供实时天气查询能力,用户输入“帮我规划杭州三日游,避开雨天”时,AI自动调用天气数据生成行程。 代码实现(Solon AI 3.3 + JDK 1.8) 第1步:(服务端)定义天气 MCP 服务。(真的只有 “5” 行代码) @McpServerEndpoint(name = "weather-server", sseEndpoint = "/mcp/weather") public class WeatherService { @ToolMapping(description = "获取指定城市的未来三天天气预报") public String getWeather(@Param(description = "城市名称") String city) { return WeatherApi.getForecast(city); // 调用真实天气API } } 第2步:(客户端)AI调用演示 McpClientProvider toolProvider = McpClientProvider.builder() .apiUrl("http://localhost:8080/mcp/weather") .build(); ChatResponse response = chatModel.prompt("杭州明天适合户外活动吗?") .options(o-> o.toolsAdd(toolProvider)) .call(); 四、技术解析:为什么这(服务端)5行代码能颠覆传统开发? @McpServerEndpoint和@ToolMapping注解魔法:将Java方法自动映射为AI可理解的工具描述,减少 80% 的胶水代码 动态协议协商:MCP客户端自动匹配服务端版本,无需手动处理兼容性问题 混合传输模式:支持SSE流式响应(实时天气变化推送)与同步请求 安全隔离层:敏感操作(如数据库访问)仅在服务端执行,客户端无直接权限 性能对比: 指标 传统REST API MCP服务 工具接入耗时 8小时/个 半小时/个 多模型支持 需重复适配 一次开发通用 长上下文支持 无 会话ID保持 五、场景扩展:MCP如何重构AI应用生态? 案例1:智能客服系统 痛点:用户问“我的订单物流到哪了”,客服需手动查询多个系统 MCP方案:对接订单数据库+物流API,AI自动组合数据生成回答,响应速度从2分钟缩短至3秒 案例2:企业知识库问答 痛点:员工查询内部文档需登录多个系统 MCP方案:连接Confluence、GitLab、CRM系统,问答准确率提升65% 案例3:AI编程助手 痛点:开发者需复制代码到IDE调试 MCP方案:直接操作IDE编译部署,操作步骤减少70% 六、未来展望:开发者该如何抓住这波技术红利? 工具升级:将现有REST服务通过OpenRewrite一键转换为MCP服务(节省90%迁移成本) 生态布局:建设垂直领域工具市场(如金融数据、医疗知识库) 架构升级:采用Streamable HTTP协议提升高并发场景稳定性 行动指南: 立即体验:GitHub示例项目 加入 Solon AI 社区获取最新工具包 关注MCP协议2.0升级(支持多模态数据流) 结束语: 当技术门槛从“月级”降至“小时级”,每个开发者都能成为AI生态的构建者。MCP不是又一个昙花一现的概念,而是打开AI普惠时代的钥匙——正如Spring框架重构Java开发,MCP正在重构AI与真实世界的连接方式。 延伸阅读: MCP协议官方文档 Solon AI 深度集成实战 百万级并发MCP服务架构设计

优秀的个人博客,低调大师

速来体验丨1Panel 支持一键部署 MCP Server,告别繁琐配置!

MCP(Model Context Protocol,模型上下文协议)是由人工智能企业Anthropic推出的开放标准,旨在为大语言模型和AI助手提供统一、标准化的接口,让AI可以轻松操作外部工具,完成更加复杂的任务,从而发挥真正的“工具调用”能力。 然而在实际操作过程中,搭建MCP Server需要手动配置大量依赖,部署门槛较高,许多用户难以上手。为了解决这个问题,1Panel v1.10.29 LTS版本推出了原生的MCP Server管理功能,该功能通过容器化方式实现一键部署MCP Server,能够极大简化搭建流程。 本文为您介绍1Panel的MCP Server管理功能的五个特点。 一、零配置一键部署 在1Panel左侧菜单栏中依次选择“AI”→“MCP”,点击“创建MCP Server”按钮并填写启动命令、端口号和所需环境变量等基础配置信息,即可在1Panel管理的服务器上一键部署MCP Server实例,无需在本地拉取代码或手动安装依赖。 1Panel的MCP Server部署流程基于Docker容器运行,隔离性强、兼容性好,真正实现了“零侵入、零配置”的部署体验,大大降低了用户操作门槛。 ▲图1 创建MCP Server 二、客户端信息自动生成 MCP Server部署成功后,1Panel会为每个MCP Server实例自动生成客户端配置信息,包括端口、地址、SSE路径等。点击“配置”按钮,即可快速获取该MCP Server的客户端配置信息。 ▲图2 MCP Server列表 ▲图3 获取MCP Client配置 用户只需要复制客户端配置信息并粘贴至MCP客户端,即可开始使用拥有MCP加成的AI助手。这种方式无需手动查找或配置环境变量,实现了从部署到使用的无缝衔接。 ▲图4 与MCP Client集成 三、支持统一域名与SSE路径 1Panel支持将多个MCP Server实例统一绑定至同一个网站域名,每个实例仅需设置不同的SSE路径进行区分。这意味着用户无需为每个MCP Server单独开放端口,所有服务都可以通过同一个端口对外提供服务。 这种方式不仅简化了公网访问的配置逻辑,也让运维操作更加集中统一。尤其是在大规模部署和企业内部网络的场景下,统一绑定网站域名能够避免暴露过多端口,减少安全风险,进一步提升部署的灵活性、安全性和可维护性。 ▲图5 统一域名与SSE路径 四、白名单访问限制 1Panel支持为每个MCP Server网站配置IP访问白名单,以此有效保障MCP Server的数据安全。用户可以根据实际需求将IP地址或IP段添加至白名单,从而保证只有白名单中的IP能够访问MCP Server网站。与此同时,系统将自动拒绝所有不在白名单中的IP的访问请求。 通过为MCP Server网站配置IP访问白名单,可以有效隔离外部非授权访问,在网络入口层面建立起第一道安全防线。同时配合1Panel的防火墙策略和容器隔离机制,可以显著提升整体系统的安全性与稳定性。 五、支持HTTPS数据加密 此外,1Panel还支持为MCP Server网站启用HTTPS协议,用户只需要上传证书即可开启加密访问,全面保障上下文交互数据的安全性。 总结 使用1Panel来管理MCP Server不仅可以降低部署门槛,也能够收获更好的使用体验,让您的AI工具集成之路更加顺畅!如果您对1Panel的MCP Server管理功能感兴趣,欢迎您部署和体验1Panel。

优秀的个人博客,低调大师

告别手动调度,海豚调度器 3.1.x 集群部署让你轻松管理多机!

转载自第一片心意 1 前言 由于海豚调度器官网的集群部署文档写的较乱,安装过程中需要跳转到很多地方进行操作,所以自己总结了一篇可以直接跟着从头到尾进行操作的文档,以方便后续的部署、升级、新增节点、减少节点的相关操作。 2. 提前准备 2.1. 基础组件 JDK:下载JDK (1.8+),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到 PATH 环境变量中。如果你的环境中已存在,可以跳过这步。 二进制包:在下载页面下载 DolphinScheduler 二进制包 数据库:PostgreSQL (8.2.15+) 或者 MySQL (5.7+),两者任选其一即可,如 MySQL 则需要 JDBC Driver 8 版本,可以从中央仓库下载。 注册中心:ZooKeeper (3.4.6+),下载地址。 进程树分析 macOS安装pstree Fedora/Red/Hat/CentOS/Ubuntu/Debian安装psmisc。 注意: DolphinScheduler 本身不依赖 Hadoop、Hive、Spark 等,但如果你运行的任务需要依赖他们,就需要有对应的环境支持。 3. 上传 上传二进制包,并且解压到某个目录,具体目录位置,自己定即可。 要注意目录名称,最好在后面加一些字符,要做到安装目录和二进制包解压目录不同名,以进行区分。 tar -xvf apache-dolphinscheduler-3.1.7-bin.tar.gz mv apache-dolphinscheduler-3.1.7-bin dolphinscheduler-3.1.7-origin 后面的 -origin 表示这是原始的二进制包解压文件,后续有配置改动时,可以修改改目录下的文件,然后重新执行安装脚本。 4. 用户 4.1. 配置用户免密及权限 创建部署用户,并且一定要配置 sudo 免密。以创建 dolphinscheduler 用户为例: # 创建用户需使用 root 登录 useradd dolphinscheduler # 添加密码 echo "dolphinscheduler" | passwd --stdin dolphinscheduler # 配置 sudo 免密 sed -i '$adolphinscheduler ALL=(ALL) NOPASSWD: ALL' /etc/sudoers sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers # 修改目录权限,使得部署用户对二进制包解压后的 apache-dolphinscheduler-*-bin 目录有操作权限 chown -R dolphinscheduler:dolphinscheduler apache-dolphinscheduler-*-bin 注意: 因为任务执行服务是以 sudo -u {linux-user} 切换不同 linux 用户的方式来实现多租户运行作业,所以部署用户需要有 sudo 权限,而且是免密的。初学习者不理解的话,完全可以暂时忽略这一点。 如果发现 /etc/sudoers 文件中有 “Defaults requirett” 这行,也请注释掉。 4.2. 配置机器SSH免密登陆 由于安装的时候需要向不同机器发送资源,所以要求各台机器间能实现SSH免密登陆。配置免密登陆的步骤如下: su dolphinscheduler ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 一定要执行下面这个命令,否则免密登录会失败 chmod 600 ~/.ssh/authorized_keys 注意: 配置完成后,可以通过运行命令 ssh localhost 判断是否成功,如果不需要输入密码就能 ssh登陆,则证明成功。 5. 启动zookeeper 启动集群中的 zookeeper 即可。 6. 修改配置 下面所有的操作,均在 dolphinscheduler 用户下执行。 完成基础环境的准备后,需要根据你的机器环境修改配置文件。配置文件可以在目录 bin/env 中找到,他们分别是 install_env.sh 和 dolphinscheduler_env.sh。 6.1. install_env.sh install_env.sh 文件配置将 DolphinScheduler 安装到哪些机器 ,以及每台机器安装哪些服务。可以在路径 bin/env/ 中找到此文件,之后按照下面的说明修改对应的配置即可。 # --------------------------------------------------------- # INSTALL MACHINE # --------------------------------------------------------- # A comma separated list of machine hostname or IP would be installed DolphinScheduler, # including master, worker, api, alert. If you want to deploy in pseudo-distributed # mode, just write a pseudo-distributed hostname # Example for hostnames: ips="ds1,ds2,ds3,ds4,ds5", Example for IPs: ips="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4,192.168.8.5" # 配置海豚调度器要安装到那些机器上 ips=${ips:-"ds01,ds02,ds03,hadoop02,hadoop03,hadoop04,hadoop05,hadoop06,hadoop07,hadoop08"} # Port of SSH protocol, default value is 22. For now we only support same port in all `ips` machine # modify it if you use different ssh port sshPort=${sshPort:-"22"} # A comma separated list of machine hostname or IP would be installed Master server, it # must be a subset of configuration `ips`. # Example for hostnames: masters="ds1,ds2", Example for IPs: masters="192.168.8.1,192.168.8.2" # 配置 master 角色要安装到哪些机器上 masters=${masters:-"ds01,ds02,ds03,hadoop04,hadoop05,hadoop06,hadoop07,hadoop08"} # A comma separated list of machine <hostname>:<workerGroup> or <IP>:<workerGroup>.All hostname or IP must be a # subset of configuration `ips`, And workerGroup have default value as `default`, but we recommend you declare behind the hosts # Example for hostnames: workers="ds1:default,ds2:default,ds3:default", Example for IPs: workers="192.168.8.1:default,192.168.8.2:default,192.168.8.3:default" # 配置 worker 角色要安装到哪些机器上,默认都放到 default 的 worker 分组内,其他分组,可以通过海豚调度器界面进行单独配置 workers=${workers:-"ds01:default,ds02:default,ds03:default,hadoop02:default,hadoop03:default,hadoop04:default,hadoop05:default,hadoop06:default,hadoop07:default,hadoop08:default"} # A comma separated list of machine hostname or IP would be installed Alert server, it # must be a subset of configuration `ips`. # Example for hostname: alertServer="ds3", Example for IP: alertServer="192.168.8.3" # 配置 alert 角色安装到哪个机器上,配置一台机器即可 alertServer=${alertServer:-"hadoop03"} # A comma separated list of machine hostname or IP would be installed API server, it # must be a subset of configuration `ips`. # Example for hostname: apiServers="ds1", Example for IP: apiServers="192.168.8.1" # 配置 api 角色安装到哪个机器上,配置一台机器即可 apiServers=${apiServers:-"hadoop04"} # The directory to install DolphinScheduler for all machine we config above. It will automatically be created by `install.sh` script if not exists. # Do not set this configuration same as the current path (pwd). Do not add quotes to it if you using related path. # 配置安装路径,将会在所有海豚集群的机器上安装服务,一定要和上面解压的二进制包目录区分开,最好带上版本号,以方便后续的升级操作。 installPath=${installPath:-"/opt/dolphinscheduler-3.1.5"} # The user to deploy DolphinScheduler for all machine we config above. For now user must create by yourself before running `install.sh` # script. The user needs to have sudo privileges and permissions to operate hdfs. If hdfs is enabled than the root directory needs # to be created by this user # 部署使用的用户,用上面自己新建的用户即可 deployUser=${deployUser:-"dolphinscheduler"} # The root of zookeeper, for now DolphinScheduler default registry server is zookeeper. # 配置注册到 zookeeper znode 名称,如果配置了多个海豚集群,则需要配置不同的名称 zkRoot=${zkRoot:-"/dolphinscheduler"} 6.2. dolphinscheduler_env.sh 可以在路径 bin/env/ 中找到此文件,该文件用来配置用到的一些环境,按照下面的说明修改对应配置即可: # JDK 路径,一定要修改 export JAVA_HOME=${JAVA_HOME:-/usr/java/jdk1.8.0_202} # 数据库类型,支持 mysql、postgresql export DATABASE=${DATABASE:-mysql} export SPRING_PROFILES_ACTIVE=${DATABASE} # 连接 url,主要修改下面的 hostname,最后配置的是东八区 export SPRING_DATASOURCE_URL="jdbc:mysql://hostname:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai" export SPRING_DATASOURCE_USERNAME=dolphinscheduler # 如果密码比较复杂,则需要前后使用英文单引号括起来 export SPRING_DATASOURCE_PASSWORD='xxxxxxxxxxxxx' export SPRING_CACHE_TYPE=${SPRING_CACHE_TYPE:-none} # 配置各角色 JVM 启动时使用的时区,默认为 -UTC,如果想要完全支持东八区,则设置为 -GMT+8 export SPRING_JACKSON_TIME_ZONE=${SPRING_JACKSON_TIME_ZONE:-GMT+8} export MASTER_FETCH_COMMAND_NUM=${MASTER_FETCH_COMMAND_NUM:-10} export REGISTRY_TYPE=${REGISTRY_TYPE:-zookeeper} # 配置使用的 zookeeper 地址 export REGISTRY_ZOOKEEPER_CONNECT_STRING=${REGISTRY_ZOOKEEPER_CONNECT_STRING:-hadoop01:2181,hadoop02:2181,hadoop03:2181} # 配置使用到的一些环境变量,按照自己的需要进行配置即可,所有需要的组件,都自己安装 export HADOOP_HOME=${HADOOP_HOME:-/opt/cloudera/parcels/CDH/lib/hadoop} export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/etc/hadoop/conf} export SPARK_HOME1=${SPARK_HOME1:-/opt/soft/spark1} export SPARK_HOME2=${SPARK_HOME2:-/opt/spark-3.3.2} export PYTHON_HOME=${PYTHON_HOME:-/opt/python-3.9.16} export HIVE_HOME=${HIVE_HOME:-/opt/cloudera/parcels/CDH/lib/hive} export FLINK_HOME=${FLINK_HOME:-/opt/flink-1.15.3} export DATAX_HOME=${DATAX_HOME:-/opt/datax} export SEATUNNEL_HOME=${SEATUNNEL_HOME:-/opt/seatunnel-2.1.3} export CHUNJUN_HOME=${CHUNJUN_HOME:-/opt/soft/chunjun} export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$DATAX_HOME/bin:$SEATUNNEL_HOME/bin:$CHUNJUN_HOME/bin:$PATH 6.3. common.properties 从自己的 hadoop 集群上下载 hdfs-site.xml 和 core-site.xml 文件,然后放到 api-server/conf/ 和 worker-server/conf/ 目录下。如果是自己搭建的 apache 的原生集群,则从各个组件的 conf 目录下找,如果是 CDH ,则可以通过 CDH 界面直接下载。 修改 api-server/conf/ 和 worker-server/conf/ 目录下的这个文件,该文件主要用来配置资源上传相关参数,比如将海豚的资源上传到 hdfs 等,按照下面的说明修改即可: # 本地路径,主要用来存放任务运行时的临时文件,要保证用户对该文件具有读写权限,一般保持默认即可,如果后续任务运行报错说是对该目录下的文件没有操作权限,直接将该目录权限修改为 777 即可 data.basedir.path=/tmp/dolphinscheduler # resource view suffixs #resource.view.suffixs=txt,log,sh,bat,conf,cfg,py,java,sql,xml,hql,properties,json,yml,yaml,ini,js # 保存资源的地方,可用值为: HDFS, S3, OSS, NONE resource.storage.type=HDFS # 资源上传的基本路径,必须以 /dolphinscheduler 开头,要保证用户对该目录有读写权限 resource.storage.upload.base.path=/dolphinscheduler # The AWS access key. if resource.storage.type=S3 or use EMR-Task, This configuration is required resource.aws.access.key.id=minioadmin # The AWS secret access key. if resource.storage.type=S3 or use EMR-Task, This configuration is required resource.aws.secret.access.key=minioadmin # The AWS Region to use. if resource.storage.type=S3 or use EMR-Task, This configuration is required resource.aws.region=cn-north-1 # The name of the bucket. You need to create them by yourself. Otherwise, the system cannot start. All buckets in Amazon S3 share a single namespace; ensure the bucket is given a unique name. resource.aws.s3.bucket.name=dolphinscheduler # You need to set this parameter when private cloud s3. If S3 uses public cloud, you only need to set resource.aws.region or set to the endpoint of a public cloud such as S3.cn-north-1.amazonaws.com.cn resource.aws.s3.endpoint=http://localhost:9000 # alibaba cloud access key id, required if you set resource.storage.type=OSS resource.alibaba.cloud.access.key.id=<your-access-key-id> # alibaba cloud access key secret, required if you set resource.storage.type=OSS resource.alibaba.cloud.access.key.secret=<your-access-key-secret> # alibaba cloud region, required if you set resource.storage.type=OSS resource.alibaba.cloud.region=cn-hangzhou # oss bucket name, required if you set resource.storage.type=OSS resource.alibaba.cloud.oss.bucket.name=dolphinscheduler # oss bucket endpoint, required if you set resource.storage.type=OSS resource.alibaba.cloud.oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com # if resource.storage.type=HDFS, the user must have the permission to create directories under the HDFS root path resource.hdfs.root.user=hdfs # if resource.storage.type=S3, the value like: s3a://dolphinscheduler; if resource.storage.type=HDFS and namenode HA is enabled, you need to copy core-site.xml and hdfs-site.xml to conf dir # resource.hdfs.fs.defaultFS=hdfs://bigdata:8020 # whether to startup kerberos hadoop.security.authentication.startup.state=false # java.security.krb5.conf path java.security.krb5.conf.path=/opt/krb5.conf # login user from keytab username login.user.keytab.username=hdfs-mycluster@ESZ.COM # login user from keytab path login.user.keytab.path=/opt/hdfs.headless.keytab # kerberos expire time, the unit is hour kerberos.expire.time=2 # resourcemanager port, the default value is 8088 if not specified resource.manager.httpaddress.port=8088 # if resourcemanager HA is enabled, please set the HA IPs; if resourcemanager is single, keep this value empty yarn.resourcemanager.ha.rm.ids=hadoop02,hadoop03 # if resourcemanager HA is enabled or not use resourcemanager, please keep the default value; If resourcemanager is single, you only need to replace ds1 to actual resourcemanager hostname yarn.application.status.address=http://ds1:%s/ws/v1/cluster/apps/%s # job history status url when application number threshold is reached(default 10000, maybe it was set to 1000) yarn.job.history.status.address=http://hadoop02:19888/ws/v1/history/mapreduce/jobs/%s # datasource encryption enable datasource.encryption.enable=false # datasource encryption salt datasource.encryption.salt=!@#$%^&* # data quality option data-quality.jar.name=dolphinscheduler-data-quality-dev-SNAPSHOT.jar #data-quality.error.output.path=/tmp/data-quality-error-data # Network IP gets priority, default inner outer # Whether hive SQL is executed in the same session support.hive.oneSession=false # use sudo or not, if set true, executing user is tenant user and deploy user needs sudo permissions; if set false, executing user is the deploy user and doesn't need sudo permissions sudo.enable=true setTaskDirToTenant.enable=false # network interface preferred like eth0, default: empty #dolphin.scheduler.network.interface.preferred= # network IP gets priority, default: inner outer #dolphin.scheduler.network.priority.strategy=default # system env path #dolphinscheduler.env.path=dolphinscheduler_env.sh # development state development.state=false # rpc port alert.rpc.port=50052 # set path of conda.sh conda.path=/opt/anaconda3/etc/profile.d/conda.sh # Task resource limit state task.resource.limit.state=false # mlflow task plugin preset repository ml.mlflow.preset_repository=https://github.com/apache/dolphinscheduler-mlflow # mlflow task plugin preset repository version ml.mlflow.preset_repository_version="main" 6.4. application.yaml 需要修改所有角色下 /conf/application.yaml 文件,包括:master-server/conf/application.yaml、worker-server/conf/application.yaml、api-server/conf/application.yaml、alert-server/conf/application.yaml,主要修改的是时区设置,具体修改如下: spring: banner: charset: UTF-8 jackson: # 将时区设置为东八区,只修改这一个地方即可 time-zone: GMT+8 date-format: "yyyy-MM-dd HH:mm:ss" 6.5. service.57a50399.js和service.57a50399.js.gz 这两个文件在 api-server/ui/assets/ 和 ui/assets/ 目录下。 分别切换到这两个目录下,然后分别找到这两个文件,之后通过 vim 命令打开,然后搜索 15e3,找到之后,将其改为 15e5。这修改的是页面响应的超时时间,默认值 15e3 表示 15 秒,我们将其改为 1500 秒,在上传大文件时,不会因为页面超时而报错。 7. 初始化数据库 驱动配置 将 mysql 驱动(8.x)拷贝到海豚调度器每个角色的 lib 目录下,包括:api-server/libs、alert-server/libs、master-server/libs、worker-server/libs、tools/libs。 数据库用户 使用 root 用户登录 mysql,然后执行以下 sql,mysql5 和 mysql8 都支持: create database `dolphinscheduler` character set utf8mb4 collate utf8mb4_general_ci; create user 'dolphinscheduler'@'%' IDENTIFIED WITH mysql_native_password by 'your_password'; grant ALL PRIVILEGES ON dolphinscheduler.* to 'dolphinscheduler'@'%'; flush privileges; 执行数据库升级脚本: bash tools/bin/upgrade-schema.sh 8. 安装 bash ./bin/install.sh 执行该脚本,会将本地的所有文件通过 scp 远程传输给上面配置文件中配置的所有机器,然后停止对应机器上的角色,之后再启动所有机器上的角色。 第一次安装之后,就已经启动了所有的角色,无需再次单独启动任何角色,如果有哪些角色没启动的话,可以去对应的机器上查看对应的日志,看具体是什么问题导致的。 9. 启停服务 # 一键停止集群所有服务 bash ./bin/stop-all.sh # 一键开启集群所有服务 bash ./bin/start-all.sh # 启停 Master bash ./bin/dolphinscheduler-daemon.sh stop master-server bash ./bin/dolphinscheduler-daemon.sh start master-server # 启停 Worker bash ./bin/dolphinscheduler-daemon.sh start worker-server bash ./bin/dolphinscheduler-daemon.sh stop worker-server # 启停 Api bash ./bin/dolphinscheduler-daemon.sh start api-server bash ./bin/dolphinscheduler-daemon.sh stop api-server # 启停 Alert bash ./bin/dolphinscheduler-daemon.sh start alert-server bash ./bin/dolphinscheduler-daemon.sh stop alert-server 一定要注意,必须使用安装海豚调度器的用户执行这些脚本,否则会有一些权限之类的问题。 每个服务在路径 <service>/conf/dolphinscheduler_env.sh 中都有 dolphinscheduler_env.sh 文件,为微服务需求提供便利。这意味着你可以在对应服务中配置 <service>/conf/dolphinscheduler_env.sh,然后通过<service>/bin/start.sh 命令基于不同的环境变量来启动各个服务。但如果使用命令 /bin/dolphinscheduler-daemon.sh start <service> 启动服务器,它将会使用文件 bin/env/dolphinscheduler_env.sh 覆盖 <service>/conf/dolphinscheduler_env.sh ,然后启动服务,这么做是为了减少用户修改配置的成本。 10. 扩容 10.1. 标准方式 参考上面的步骤,进行如下操作: 新节点 安装配置好 JDK。 新建海豚用户(Linux 用户),然后配置免密登录、权限等。 之前安装海豚调度器时解压二进制安装包的机器上。 登录安装海豚的用户。 切换到之前安装海豚调度器时解压二进制安装包,修改配置文件:bin/env/install_env.sh,在该配置文件中,修改需要在新节点上部署的角色。 执行 /bin/install.sh 文件进行安装,该脚本会按照 bin/env/install_env.sh 文件中的配置,将整个目录重新 scp 到所有的机器,之后停止所有机器上的角色,然后再启动所有角色。 该方式的缺点:如果海豚调度器上有很多分钟级别的任务,或者是 flink、spark 之类的实时任务,由于该操作会停止所有的角色,然后启动,这期间会花费一定的时间,在这期间,这些任务可能会由于整个集群的重启,从而异常停止,或者是无法被正常调度起来。但海豚调度器自己实现了自动容错和灾备等功能,所以可以这么操作,最后观察下所有任务执行是否正常。 10.2. 简单方式 参考上面的步骤,进行如下操作: 新节点 安装配置好 JDK。 新建海豚用户(Linux 用户),然后配置免密登录、权限等。 之前安装海豚调度器时解压二进制安装包的机器上。 登录安装海豚的用户。 将之前修改完配置的整个目录直接压缩,然后传输到新节点上。 新节点 在新节点上解压文件,然后将其重命名到之前配置文件 bin/env/install_env.sh 中配置的安装目录下。 登录安装海豚的用户。 需要在新节点部署哪些角色,就启动哪些角色,具体脚本位置:/bin/dolphinscheduler-daemon.sh,启动命令为: ./dolphinscheduler-daemon.sh start master-server ./dolphinscheduler-daemon.sh start worker-server 登录到海豚调度器界面,然后“监控中心”中观察,对应角色在新节点是否启动。 11.缩容 在需要下线的机器上,通过 /bin/dolphinscheduler-daemon.sh 脚本停止机器上所有的角色,停止命令为: ./dolphinscheduler-daemon.sh stop worker-server 登录到海豚调度器界面,然后“监控中心”中观察,刚才机器上停止的角色是否已经消失。 在之前安装海豚调度器时解压二进制安装包的机器上 登录安装海豚的用户。 修改配置文件:bin/env/install_env.sh,在该配置文件中,删除下线角色对应的机器。 12. 升级 按照上面的步骤,一步一步操作即可,对于已经有过的操作,无需二次操作。下面是一些具体的操作步骤: 上传新版二进制包。 解压,解压到和旧版安装目录不同的目录,或者是重命名也可以。 修改配置文件,比较简单的方式是,将上面步骤中涉及到的所有配置文件,从之前安装的目录下拷贝到新版本目录下,替换即可。 将其他节点上部署的一些组件,全部打包,然后解压放到新节点对应的位置。具体需要拷贝哪些组件,可以查看 dolphinscheduler_env.sh 文件中的配置。 配置驱动,参考《初始化数据库》中的步骤。 停止之前的集群。 备份整个数据库。 执行数据库升级脚本,参考《初始化数据库》中的步骤。 执行安装脚本,参考《安装》。 升级完成,登录界面,查看“监控中心”,看所有角色是否都成功启动。 文件转载,请标明出处。欢迎大家一起讨论技术,写的不对的地方还请大家一起讨论。 原文链接:https://blog.csdn.net/u012443641/article/details/131419391 本文由 白鲸开源科技 提供发布支持!

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册