最新要闻
- 联发科MT6825芯片组获上海MWC 2023亚洲突破性设备创新大奖!手机卫星可双向通信_焦点资讯
- 支持Type-C充电:英菲克F1无线鼠标24.9元抄底
- 天天热消息:做错N多年!央视科普:鸡蛋别再放到冰箱门上了
- 要求罚金30亿美元!Chatgpt涉嫌信息盗窃被起诉 全球视讯
- 官方辟谣激情誓师女生考508分:女生考了600多分 考得特别好 环球焦点
- 全球低水足迹倡议(LWFi)联盟扩容,伊利“双足迹”开启全链减碳新篇章_世界视点
- 新款2024MGCyberster泄露 当前热讯
- 天天快讯:暴露年龄!时隔16年 Office“大眼夹”回归Windows 11:功能焕然一新
- 16.5亿打造!《封神》妲己首次亮相引热议 网友称妆造诡异在拍画皮吗
- 苹果之后 三星被指侵犯加州理工Wi-Fi专利:索赔可达数十亿美元-世界新消息
- “快乐水”不快乐了!阿斯巴甜将被定为可能致癌物质|天天热资讯
- 华为发布F5.5G智简全光联接四大创新:万兆时代来了
- 讯息:大宗交易:蓝色光标成交6967.8万元,折价1.96%(06-29)
- 天天速读:高铁踹老头底被曝
- 如何使用 iOS 17 将照片变成 iMessage 贴纸
- 多家高校下月起停用微信支付 微信团队致歉:即刻修正
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
拈花云科基于 Apache DolphinScheduler 在文旅业态下的实践
作者|云科NearFar X Lab团队 左益、周志银、洪守伟、陈超、武超
(资料图)
一、导读
无锡拈花云科技服务有限公司(以下简称:拈花云科)是由拈花湾文旅和北京滴普科技共同孵化的文旅目的地数智化服务商。2022年底,拈花云科NearFar X Lab团队开始测试DolphinScheduler作为交付型项目和产品项目的任务调度工具。本文主要分享了拈花云科在任务调度工具的选择、迭代和实践过程中的经验,希望对大家有所启发。
二、业务背景
我们的服务对象主要是国内各个景区、景点,业务范围涵盖文旅行业的多个板块,如票务、交通、零售、住宿、餐饮、演绎、游乐、影院、KTV、租赁、服务、会务、康乐、康养、电商、客服、营销、分销、安防等。由于业务系统来源较多,多系统下的数据源类型差异化较大,所以在实施数据项目时我们需要能够支持多种数据来源(Mysql、Oracle、SqlServer、Hive、Excel……)的数据集成任务。同时根据大部分景区为国有化的特点,我们也需要具备能够提供私有化交付部署及SAAS化数据中台产品解决方案的双重服务支撑能力。
三、DolphinScheduler 调度系统选型过程
在团队成立之初为了快速构建MVP业务版本,我们沿用了团队同事之前用过的Kettle调度方案。该方案下通过Kettle完成可视化调度的配置及对于异构数据的集成任务,通过Python 调用HQL脚本完成基于Hive的传参数据计算。基于MVP的构建,我们也开始思考,在我们的整体中台架构下该需要一个什么样的调度系统,以及除了调度这件事本身我们还需要哪些功能和能力。带着这些问题我们开始整理自己的需求,以及每个需求下有什么样的产品可以适配。
调度系统需要支撑的应用场景
文旅业态下的数据使用场景与其它业态下的使用场景大体相同,主要分为以下四类:
调度系统需要支撑的项目类型
我们选择的调度系统需要同时具备实施类项目、SAAS产品两种需求下的数据中台支撑能力
基于以上需求我们进行了调度系统的选型对比。网上有非常多关于Oozie、Azkaban、Airflow、DolphinScheduler、Xxl-job、Kettle等调度选型的文章及介绍,在此不过多的展开他们的优缺点。我们觉得每个产品的设计都有它自身的考量,都有适用与不适用的场景。结合我们自身的使用需求最终我们选择了使用DolphinScheduler作为数据中台的调度平台。
主要原因如下:
- High Reliability(高可靠性)高可靠性是我们看重的第一要点,因为不管是实施项目还是SAAS产品,只有系统稳定产品才可以正常运行。DolphinScheduler通过去中心化设计、原生 HA 任务队列支持、过载容错能力支持提供了高度稳健的环境。在我们半年的使用过程中也验证了其非常稳定。
- High Scalability:(高扩展性)由于我们要支持实施项目/SAAS产品两种场景下的使用,DolphinScheduler的多租户支持很好的契合了SAAS场景下资源隔离的使用需求。同时其扩缩容能力、高度的调度任务上限(10万+)都能很好的支撑我们业务的扩展性需求。
- 丰富的数据集成能力DolphinScheduler提供的任务类型已经远远涵盖了我们经常使用的任务类型(DataX、SeaTunnel的支持本身就涵盖了较多的Source2Target同步/推送场景)。
- 支持Kubernetes部署上文提到在私有化的部署方式下客户的部署环境大不相同,对于实施团队来说,如果能够简单、高效、一致的完成部署则会极大的提高项目投递部署效率,同时也能减少很多因环境原因而产生的问题。
- 不仅仅是调度在调研DolphinScheduler的过程中我们发现,除了调度本身这个环节,结合DCMM(数据管理能力成熟度评估模型)的国标8个能力域,DolphinScheduler在数据质量模块也做了很多实现,这无疑又命中了我们对于数据质量能力建设的需求。同时Apache DolphinScheduler的服务架构中还有AlertServer服务。作为整体数据中台方案来说后期完全可以将所有报警需求集成在Apache DolphinScheduler的报警服务中,避免多系统重复造轮子。从这些点考虑DolphinScheduler它不仅仅是一个调度工具而更像是一个数据开发平台。(期待随着社区的迭代会有更完整的生态实现)
- 问题处理难度DolphinScheduler社区非常的活跃,在加入DolphinScheduler社区群后每天都可以看到非常多的伙伴在交流关于Apache DolphinScheduler使用过程中的问题,社区人员也都积极的予以回复。同时Dolphinscheduler又是咱们国产开源软件,所以完全不必担心存在沟通上的障碍。
四、基于DolphinScheduler的项目实践
1、DolphinScheduler ON Kubernetes
DolphinScheduler支持多种部署方式:单机部署(Standalone)、伪集群部署(Pseudo-Cluster)、集群部署(Cluster)、Kubernetes部署(Kubernetes)。在项目实施的场景下由于客户提供的部署环境千变万化,我们需要一种稳定、快速、不挑环境的部署方式。Apache DolphinScheduler on K8S的部署方式很好的满足了我们的需求,此部署方式能极大的提高整体项目的部署效率及动态扩展性。
- Kubernetes是一个开源的容器编排平台,可以实现容器的自动化部署、扩缩容、服务发现、负载均衡,可以提高DolphinScheduler的可用性、可扩展性和可维护性
- Kubernetes可以支持多种存储类型,包括本地存储、网络存储和云,可以满足DolphinScheduler多节点共享持久化存储需求
- Kubernetes可以支持多种调度策略,包括亲和性、反亲和性、污点和容忍,可以优化DolphinScheduler的资源利用率,提高任务执行效率。
- Kubernetes可以支持多种监控和日志方案,包括Prometheus、Grafana、ELK等等,可以方便地对DolphinScheduler的运行状态和性能进行监控,分析和告警
在部署Apache DolphinScheduler on K8S 的过程中我们也曾遇到过一些问题,下面是我们总结的一些Kubernetes部署要点:
自定义镜像
FROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-alert-server:版本号# 如果你想支持 MySQL 数据源COPY ./mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs
dolphinscheduler-api
FROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-api:版本号# 如果你想支持 MySQL 数据源COPY ./mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs# 如果你想支持 Oracle 数据源COPY ./ojdbc8-19.9.0.0.jar /opt/dolphinscheduler/libs
dolphinscheduler-master
FROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-master:版本号# 如果你想支持 MySQL 数据源COPY ./mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs
dolphinscheduler-tools
FROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-tools:版本号# 如果你想支持 MySQL 数据源COPY ./mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs
dolphinscheduler-worker
FROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:版本号# 如果你想支持 MySQL 数据源COPY ./mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs# 如果你想支持 Oracle 数据源COPY ./ojdbc8-19.9.0.0.jar /opt/dolphinscheduler/libs# 如果你想支持 hadoop 数据源COPY ./hadoop-common-2.7.3.jar /opt/dolphinscheduler/libsCOPY ./hadoop-core-1.2.1.jar /opt/dolphinscheduler/libs# 如果你想支持 hive 数据源COPY ./hive-common.jar /opt/dolphinscheduler/libsCOPY ./hive-jdbc.jar /opt/dolphinscheduler/libsCOPY ./hive-metastore.jar /opt/dolphinscheduler/libsCOPY ./hive-serde.jar /opt/dolphinscheduler/libsCOPY ./hive-service.jar /opt/dolphinscheduler/libs# 安装python3环境RUN apt-get update && \ apt-get install -y --no-install-recommenApache DolphinScheduler curl && \ rm -rf /var/lib/apt/lists/*RUN apt-get update && \ apt-get install -y --no-install-recommenApache DolphinScheduler libcurl4-openssl-dev libssl-dev && \ rm -rf /var/lib/apt/lists/*RUN apt-get update && \ apt-get install -y --no-install-recommenApache DolphinScheduler python3 && \ rm -rf /var/lib/apt/lists/*RUN apt-get update && \ apt-get install -y --no-install-recommenApache DolphinScheduler python3-pip && \ rm -rf /var/lib/apt/lists/* # 安装dataX 并且解压缩COPY ./datax.tar.gz /homeRUN tar -zxvf /home/datax.tar.gz -C /opt
配置文件修改
官方教程中的helm进行安装,在安装过程中需要修改源码中 "/deploy/kubernetes/dolphinscheduler/
" 路径下的 "values.yaml,Chart.yaml
" 里的相关镜像和版本(注:原配置没有指定持久化储存类,会使用默认的存储类,建议是修改并使用可多节点读写并且可以弹性扩展的,多节点读写便于worker节点共用同一套lib)
生产配置
- dolphinscheduler-api 3 副本(注:默认是 1副本,但是实际使用中发现,平台页面在使用过程中会有卡顿,增加副本数之后,会有明显改善)
- dolphinscheduler-alert 1副本
- dolphinscheduler-zookeeper 1副本
- dolphinscheduler-worker 3副本
- dolphinscheduler-master 3副本
k8s部署总结
采用k8s部署后,最大感受就是可排除环境干扰,快速扩展,迁移,部署,帮助我司实现了数据中台私有化中的调度标准化,该方案已在多个景区中进行快速落地并应用。
2、基于SQL脚本血缘的DolphinScheduler工作流自动化实现
项目背景
基于景区中各个业务系统(票务、营销、安防、酒店、商业、能耗、停车等)在景区机房下建设数据中台,完成以下应用需求:
- 满足各个业务部门日常的报表需求
- 支持各类大屏看板展示
- 为景区的管理层决策提供数据依据
技术选型
数据仓库:Doris调度工具:DolphinScheduler 使用版本:3.0.0版本管理:Gitlab容器编排:Kubernete
处理流程
- 业务分析与指标确认:与业务部门沟通,了解业务需求和目标,明确数据指标的定义、计算逻辑和展示方式。
- 数据仓库分层和设计:根据数据仓库的四层架构(ODS、DWD、DWS、ADS),设计数据模型和表结构,规范命名和注释。
- 数据脚本开发:编写数据抽取、清洗、转换、加载等脚本,实现数据从源系统到目标表的流转和处理。
- 数据任务调度:入仓后的执行脚本通过血缘识别依赖自动录入DolphinScheduler形成工作流任务调度(设置任务依赖、触发条件、重试策略等参数)监控任务运行状态和日志。
- 数据输出和文档:输出标准指标库和相关文档,供BI、可视化报表等使用,同时编写数据开发文档,记录数据开发过程中的关键信息和问题。
下面介绍下我们根据SQL血缘识别自动生成Apache DolphinScheduler调度任务的实现过程:
在DolphinScheduler平台上开发数据调度工作流的过程中我们遇到一个问题:如果一个工作流下的任务量太多,在原有的UI界面中想通过界面方式完成配置更改以及血缘关系的建立等操作会非常不便捷。即便是通过任务定义去配置,当上百个任务同时需要配置依赖关系时也是一个不小的工作量开销而且还容易出错,后期的更新迭代也较为不便。
我们结合工作流下SQL任务本身的特点(数仓SQL任务是整体按照Apache DolphinScheduler、DWD、DWS、Apache DolphinScheduler 的计算流程进行计算,每个表对应一个Apache DolphinScheduler的Task既每个Task都会包含SourceTable及TargetTabe。通过这层关系我们就可以构建起完整的数仓任务血缘依赖)。基于以上想法我们实现了从数据脚本自动生成对应的工作流和任务的自动化方案:
- 数据入仓后的开发脚本以每个表单为单位对应生成一个TaskSQL脚本提交到git。
- 自动化工具生成工作流及任务前自动从git库中获取最新的数据脚本。
- 自动化工具拉取到最新代码后识别和分析所有数据脚本之间的血缘关系。
- 自动化工具通过血缘关系自动将所有的任务关联并组装到一个工作流中:每个任务执行完成后,会立即触发下游任务,最大化地利用服务器资源。
以下是该实现的核心代码:
sql解析
SqlParse是使用阿里的druid中的组件MySqlStatementParser /** * sql解析 * @param sqlStr * @return */public static Map> sqlParser(String sqlStr) { List sqlList = StrUtil.split(sqlStr, ";"); Map> map = new HashMap<>(); for (String sql : sqlList) { if (StrUtil.isBlank(sql)) { continue; } // 这里使用的时 mysql 解析 MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement sqlStatement = parser.parseStatement(); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); sqlStatement.accept(visitor); Map tableStatMap = visitor.getTables(); for (Map.Entry tableStatEntry : tableStatMap.entrySet()) { String name = tableStatEntry.getKey().getName(); // 这里的 value 有两种 Select(父级)、Insert(子级) String value = tableStatEntry.getValue().toString(); if (map.containsKey(value)) { map.get(value).add(name); } else { Set list = new HashSet<>(); list.add(name); map.put(value, list); } } } return map;}
节点对象定义
/** * 任务节点定义 */public class Apache DolphinSchedulerTaskNode implements Serializable { private static final long serialVersionUID = 1L; /** * 源表 */ private List sourceTableName = new ArrayList<>(); /** * 目标表 */ private String targetTableName; /** * 源sql */ private String sql; /** * 用sql做一个MD5签名 */ private String md5; /** * 用sql名称 */ private String name; /** * 任务code */ private Long taskCode; ...}/** * 树型节点定义 */public class MyTreeNode extenApache DolphinScheduler Apache DolphinSchedulerTaskNode { /** * 添加一个子节点列表属性 */ private List children; ...}
树型结构组装
/** * 解析sql,并组装node * * @param files * @return */private static List treeNodeProcess(List files) { List sourceList = new ArrayList<>(); for (File sqlFile : files) { // 1 取出里面的 sql 脚本内容 String sql = FileUtil.readUtf8String(sqlFile); // 2 解析里面的脚本内容 Map> map = null; try { // 血缘解析 map = AutoCreateTask.sqlParser(sql); } catch (Exception e) { log.error(" table-parser error: {}", sqlFile.getPath()); } // 3 将每一个sql的 source , target 解析出来 if (ObjectUtil.isNotNull(map)) { MyTreeNode treeNode = new MyTreeNode(); treeNode.setName(sqlFile.getName()); if (map.containsKey("Select")) { Set select = map.get("Select"); treeNode.setSourceTableName(new ArrayList<>(select)); } treeNode.setSql(sql); if (map.containsKey("Insert")) { Set insert = map.get("Insert"); treeNode.setTargetTableName(new ArrayList<>(insert).get(0)); } sourceList.add(treeNode); } } // 将sql按照 source , target 组成 树状结构 return TreeUtil.getTree(sourceList);}/** * 组成树状结构 * @param sourceList * @return */public static List getTree(List sourceList) { Map> sourceMap = new HashMap<>(); Map> targetMap = new HashMap<>(); for (MyTreeNode node : sourceList) { //源表Map List subSourceTableList = node.getSourceTableName(); if (IterUtil.isNotEmpty(subSourceTableList)) { for (String subSourceTable : subSourceTableList) { if (sourceMap.containsKey(subSourceTable)) { sourceMap.get(subSourceTable).add(node); } else { Set nodeSet = new HashSet<>(); nodeSet.add(node); sourceMap.put(subSourceTable, nodeSet); } } } //目标表Map String targetTableName = node.getTargetTableName(); if (targetMap.containsKey(targetTableName)) { targetMap.get(targetTableName).add(node); } else { Set nodeSet = new HashSet<>(); nodeSet.add(node); targetMap.put(targetTableName, nodeSet); } } //创建一个列表,用于存储根节点 List rootList = new ArrayList<>(); for (MyTreeNode node : sourceList) { // 将子节点处理好 String targetTableName = node.getTargetTableName(); if (sourceMap.containsKey(targetTableName)) { List childrenList = node.getChildren(); if (IterUtil.isEmpty(childrenList)) { childrenList = new ArrayList<>(); node.setChildren(childrenList); } childrenList.addAll(sourceMap.get(targetTableName)); } List subSourceTableList = node.getSourceTableName(); boolean isRoot = true; for (String subSourceTable : subSourceTableList) { if (targetMap.containsKey(subSourceTable)) { isRoot = false; break; } } if (isRoot) { rootList.add(node); } } return rootList;}
部分效果图展示:
自动化生成的任务定义
自动化生成的工作流定义图增量运行结果
自动化实现总结
- 数仓调度任务的秒级上线与切换通过该方式将数仓开发与DolphinScheduler解耦,实现了整体数据调度任务的秒级上线与切换。这样,我们可以快速复制标品化数据建模,极大地简化了实施的难度。
- 血缘进行的任务关联与生成通过血缘进行的任务关联与生成,大大提升了整体的资源利用率,也减少了人工的投入和成本。
- 血缘监控和管理通过血缘监控和管理,可以帮助我们及时发现和纠正任务执行过程中的问题和错误,保证数据质量和准确性。
五、未来规划
- 离在线统一调度 :实现基于Apache SeaTunnel的离线与实时数据同步调度,使得两个场景在一个平台完成。
- 应用基线管理:根据各任务的上下游依赖构建数据应用基线,并监控各目标任务及其依赖任务是否按时成功运行,以确保目标任务的准时产出。
- 任务指标监控:支持实时查看每个组件的指标,例如输入记录数、输出记录数和执行时间等。
- 数据血缘关系:上报数据源、目标表、字段等信息,构建数据血缘关系图,方便追溯数据的来源和影响。
- 资源文件版本管理:支持资源文件等的简单多版本管理,可以查看历史版本、回滚到指定版本等。
六、总结与致谢
- 通过使用DolphinScheduler替换原有的调度工具,使得数据开发运维实现了平台统一化。基于Apache DolphinScheduler提供的强大集成扩展插件能力大大提升了数据集成与数据开发的效率。
- DolphinScheduler自带的告警管理功能非常全面。配合此功能我们建立了运维值班制度以及微信告警通知的功能。故障发生时,运维人员可以第一时间收到报警通知,有效提高了故障的感知能力。
- 基于DolphinScheduler调度技术方案在多个项目中的优异表现,使得我们更好的推动了公司的数据驱动战略。从实践中沉淀出公司的数据实施SOP,为各个客户、业务部门提供了及时、准确、全面的数据分析和决策支持。
- 我们第一次部署时使用的是3.0.0 版本。目前社区已经发布了 3.1.7 迭代速度非常快。如果你们的项目正在选型调度工具,我们强烈建议使用DolphinScheduler。加入社区进群会有非常多的前辈、大佬带你起飞。DolphinScheduler 值得大力推荐,希望大家都能从中受益,祝愿DolphinScheduler生态越来越繁荣,越来越好!
本文由 白鲸开源 提供发布支持!
关键词:
-
拈花云科基于 Apache DolphinScheduler 在文旅业态下的实践
![file](https: img2023 cnblogs com other 2685289 202306 2685289-2
来源: 拈花云科基于 Apache DolphinScheduler 在文旅业态下的实践
.NET 个人博客-添加RSS订阅功能 世界快播
如何将视频文件.h264和音频文件.mp3复用为输出文件output.mp4?
天天热资讯!商品日报(6月29日):尿素再度拉涨超5% 供应利多刺激甲醇盘中涨超3%
联发科MT6825芯片组获上海MWC 2023亚洲突破性设备创新大奖!手机卫星可双向通信_焦点资讯
支持Type-C充电:英菲克F1无线鼠标24.9元抄底
天天热消息:做错N多年!央视科普:鸡蛋别再放到冰箱门上了
要求罚金30亿美元!Chatgpt涉嫌信息盗窃被起诉 全球视讯
官方辟谣激情誓师女生考508分:女生考了600多分 考得特别好 环球焦点
全球低水足迹倡议(LWFi)联盟扩容,伊利“双足迹”开启全链减碳新篇章_世界视点
IDA的使用-1_世界新消息
clop勒索软件攻击活动频发,西门子能源中招_世界观察
精彩看点:构建数字工厂丨数据分析与图表视图模型的配置用法
券商数字化创新场景数据中台实践
热门看点:C# 序列化大小写 序列化对象为大小写 JsonConvert.SerializeObject
新款2024MGCyberster泄露 当前热讯
第十四届夏季达沃斯论坛闭幕
天天快讯:暴露年龄!时隔16年 Office“大眼夹”回归Windows 11:功能焕然一新
16.5亿打造!《封神》妲己首次亮相引热议 网友称妆造诡异在拍画皮吗
苹果之后 三星被指侵犯加州理工Wi-Fi专利:索赔可达数十亿美元-世界新消息
“快乐水”不快乐了!阿斯巴甜将被定为可能致癌物质|天天热资讯
华为发布F5.5G智简全光联接四大创新:万兆时代来了
讯息:大宗交易:蓝色光标成交6967.8万元,折价1.96%(06-29)
解读 RocketMQ 5.0 全新的高可用设计
探秘华为云盘古大模型:AI for industries的身体力行_报道
天天速读:高铁踹老头底被曝
科创板收盘播报:科创50指数跌0.67% 新股时创能源较发行价涨63.91%|全球热闻
如何使用 iOS 17 将照片变成 iMessage 贴纸
多家高校下月起停用微信支付 微信团队致歉:即刻修正
鳄鱼独居16年产子 科学家:濒临灭绝物种的生存策略
南极人纯棉抗菌袜子8双14.9元:吸湿排汗 亲肤透气
【全球报资讯】多家高校下月起停用微信支付 腾讯回应网友不买账:专家称反垄断太有意义
Intel四代至强命运多舛:突曝严重Bug 部分停止出货
精彩看点:司法部出手!这项业务,有大变化!
【后端面经-Java】公平锁和加锁流程 全球简讯
讯息:玖章算术与百度智能云达成合作,「NineData SQL 开发」成为百度智能云主推的数据库工具
【高端访谈】中非经贸博览会将助力刚中贸易提质升级——访刚果(金)外贸部长布萨_当前视讯
央企改革三年重点任务考核结果出炉:三大运营商排名一一曝光
摩托骑手被汽车撞下高架 现场惨!官方通报:系被追尾 伤者暂无生命危险
立白洗衣液大促:山茶幽香、除菌除螨 10斤到手38元_每日简讯
MWC牌面!魅族Flyme Auto上央视:车机互联打通软硬件|当前快看
露牙媚眼羞涩笑主播圈粉中老年人:当当网李国庆在线求合作
每日消息!索尼ZV-E1“打鸡血”:免费升级4K 120p拍摄
年内8家“袖珍”IPO公司登陆港交所-天天观天下
鼎通科技(688668):该股换手率大于8%(06-29)_世界速讯
性能4倍于1060!RTX 4060今天开售:2399元 英伟达诚意感受到没-当前速读
世界即时看!疑因不满项目谈判被提前泄露:特斯拉或已放弃在西班牙建厂!
今日讯!内蒙古康巴什区:让“梧桐树”更加枝繁叶茂
环球播报:装机选500W电源就是万金油?你又错了
海南环岛旅游公路主线路基段即将完工:12月底通车 串联全省景点|独家
Windows自带杀软又出问题:Defender新版CPU占用过高|环球焦点
每部手机都有的出厂标签要改了!工信部:7月1日起正式启用新型进网许可标志
90后宝妈沙漠边缘送奶茶月入7000 我能赚钱生娃:直言男人除了赚钱还能干啥? 当前速递
卢卡申科:普京曾有意杀死普里戈任,我劝他不要鲁莽行事
数字经济催生的低代码开发浪潮,JNPF带你轻松实现应用程序拓展! 天天日报
直播平台源码功能分享:直播回放功能的实现_当前看点
【天天快播报】云顶新耀-B早盘持续走高涨近9% 中金维持跑赢行业评级
能在车上点外卖了!特斯拉或将推出应用商城 可支持第三方应用与服务 热点聚焦
法庭文件出纰漏 五星大饭店运营成本曝光|实时焦点
剑指比亚迪海豚 宝骏云朵外观细节图发布:全球顶级设计师操刀 环球观察
40度高温杀回马枪!南方多地加入高温群聊蒸桑拿
传奇女歌手麦当娜进ICU:因细菌感染_每日看点
宁德时代联合长安汽车等共设动力电池公司
js的Set数据类型
Linux_Centos 增加中文字体支持|环球视点
直播系统聊天技术(九):千万级实时直播弹幕的技术实践
天天看热讯:【Oracle】使用PL/SQL实现冒泡排序
BackboneJS教程_编程入门自学教程_菜鸟教程-免费教程分享 环球关注
环球快讯:智能合约在数字人民币中的应用与治理
2023年普通高校招生录取工作即将开始,教育部发出提醒——高校招生录取期间谨防受骗
世界速讯:47度高温!印度遭极端“烤验”:近期已造成多人死亡
网易游戏公布暑假未成年人限玩时间:大模型干预不理性消费_全球热头条
全球观速讯丨比NS还小却塞进AMD 7840U!AYANEO公布新掌机AIR 1S
焦点热门:599元 小米电视EA32上架:升级5GHz Wi-Fi、分辨率不足1080P
1099元起 Redmi Note 12R发布:首发第二代骁龙4
女子称喂奶后发现医院母婴室装有摄像头?院方回应 信息
天天新资讯:k8s 深入篇———— 守护容器[九]
Spring Boot 项目设计业务操作日志功能,写得太好了!-世界即时看
毕业季,科学城幼儿园大班萌娃用画笔勾勒未来|当前热文
辽宁:全链条打击证券犯罪 去年以来追赃挽损7.14亿余元
上海电气印度业务被诈骗88亿 反被索赔21亿?官方辟谣-环球微头条
腾讯回应数百人部门解散:正常架构调整 不涉及人员优化 每日聚焦
iPhone上市开售16周年:共38款机型 售价越来越贵_独家焦点
全国首位视障播音硕士毕业:键盘盲打完成6万字论文 9年读了百本盲书-天天热门
不惯着!女子人肉占车位撒泼打滚:结局舒适-世界要闻
一次日志配置未生效问题排查记录
linux把文件压缩成.tar.gz的命令&各个压缩解压命令大全--九五小庞
MFC中使用多线程
希望所有计算机专业学生都知道这门课-世界速看
我市举行天然气应急救援演练|世界快看点
7月见!华为大动作不断:将发布新款存储 面向AI大模型 世界观焦点
凯迪拉克格局打开!赞助节目中允许宣传理想L9 还邀请李想体验新车-天天即时
辣眼睛!男子鞋底塞112张《塞尔达传说:王国之泪》卡带入境被查|天天新消息
每日热点:董丽娜,毕业快乐!
环球快播:Linux-vs-MacOS-,你更喜欢哪个系统?
世界热点评!【读财报】一季度信用卡消费者投诉透视:监管处理信用卡业务投诉超3.2万件 工商银行被投诉总量高
cad什么版本最好用_cad那个版本比较好用
对标苹果Studio Display!三星首款5K显示器开售:9999元还送1T SSD
网飞版《三体》预告播放破千万 粉丝喊话别拍砸了:国内拍技术落后?_环球新资讯
ChatGPT假装奶奶哄睡:能免费生成Win系统激活码