wenmo8 发布的文章

前言

在平时的开发中随着我们系统应用不断地迭代变的复杂,对应用的实时监控变得越来越重要。实时监控不仅可以帮助我们快速定位问题,还能在出现问题时及时采取措施,减少业务中断的时间。

本文将介绍一个名为WatchDog的.NET开源实时应用监控系统,它可以帮助我们轻松实现对.NET应用的实时监控。

项目介绍

WatchDog是一个开源(MIT License)、免费的实时应用监控系统,专为ASP.NET Core Web应用程序和API设计。我们可以实时记录和查看应用程序中的消息、事件、HTTP请求和响应,以及运行时捕获的异常。

一个高效的监控系统不仅能提高应用的可用性和可靠性,还能帮助我们更快地解决问题。WatchDog是一款专为.NET应用设计的开源实时应用监控系统,它提供了一系列强大的功能来帮助我们监控应用的状态和性能。

功能特点

  • 实时日志记录
    :能够实时记录HTTP请求、响应以及运行时捕获的异常。
  • 代码内日志记录
    :支持在代码中记录消息和事件。
  • 日志视图查看
    :提供易于使用的日志查看界面。
  • 日志搜索功能
    :支持对HTTP请求和异常日志进行搜索。
  • HTTP日志筛选
    :可根据HTTP方法和状态码筛选HTTP日志。
  • 日志视图认证
    :提供日志视图的访问权限控制。
  • 自动日志清理
    :支持自动清除旧的日志记录。
  • 报警通知
    :支持通过邮件、短信等多种方式发送报警通知,确保能够及时得到反馈。
  • 灵活配置
    :可以根据应用需求进行灵活的配置,适应不同的监控需求。
  • 易于集成
    :通过简单的API调用即可集成到现有的.NET应用中。

项目技术栈

  • 后端
    :基于.NET Core 或 .NET 5及以上版本。
  • 前端
    :使用 React 或 Angular等前端框架搭建的用户界面。
  • 数据库
    :支持MySQL、PostgreSQL等关系型数据库,以及MongoDB等NoSQL数据库。
  • 官方支持 .NET 8
    :新增对 .NET 8 的官方支持。
  • .NET 8 中的 Output Cache 支持
    :增加了对 .NET 8 中使用 Output Cache 的支持。
  • 使用正则表达式黑名单
    :新增了使用正则表达式进行黑名单过滤的功能。

工作原理

WatchDog 利用 SignalR 实现了实时监控,并使用LiteDb作为无需配置的类似MongoDB的服务器端数据库,同时也支持使用外部数据库(如MSSQL、MySQL、PostgreSQL、MongoDB)。

1、
支持.NET版本

.NET Core 3.1 及更高版本。

2、下载源码

通过下载源码,可以进行学习和应用,具体操作如下图所示:

安装与配置

1、WatchDog 安装

搜索
WatchDog.NET
NuGet包进行安装,具体如下图所示:

2、WatchDog 服务注册

在ASP.NET Core Web API 的
Program.cs

Startup.cs
中注册 WatchDog 服务。

从ILogger 记录日志到 WatchDog

还可以将来自.NET的
ILogger
的日志记录到 WatchDog 中。

适用于 .NET 6 及以上版本

builder.Services.AddWatchDogServices(opt =>{  
opt.IsAutoClear
= true;
opt.ClearTimeSchedule
=WatchDogAutoClearScheduleEnum.Monthly;
opt.DbDriverOption
=WatchDogDbDriverEnum.Mongo;
opt.SetExternalDbConnString
= "mongodb://localhost:27017";
});
builder.Logging.AddWatchDogLogger();

对于 .NET Core 3.1


Program.cs
类的
CreateHostBuilder
方法中配置日志记录,并添加
.AddWatchDogLogger()

Host.CreateDefaultBuilder(args)
.ConfigureLogging( logging
=>{
logging.AddWatchDogLogger();
})
.ConfigureWebHostDefaults(webBuilder
=>{
webBuilder.UseStartup
<Startup>();
});

3、添加异常记录器

在主要的WatchDog中间件之前添加异常日志记录器,最好将其放置在中间件的最上面,以便捕捉可能的早期异常。

app.UseWatchDogExceptionLogger();

...

app.UseWatchDog(opt
=>{
opt.WatchPageUsername
= "admin";
opt.WatchPagePassword
= "Qwerty@123";
...
});

4、设置自动清除日志(可选)

该功能可在特定时间后自动清除日志。

注意
:当
IsAutoClear
设置为
true
时,默认的清除计划时间为每周。

如需覆盖默认设置,请按照以下方式进行配置:

services.AddWatchDogServices(opt =>{ 
opt.IsAutoClear
= true;
opt.ClearTimeSchedule
=WatchDogAutoClearScheduleEnum.Monthly;
});

5、设置日志记录到外部数据库(可选)

将日志记录到数据库,如SQL Server (MSSQL)、MySQL、PostgreSQL 或 MongoDB,可以根据需求配置。

  • 添加数据库连接字符串
    :提供数据库的连接字符串。
  • 选择数据库驱动选项
    :根据所使用的数据库类型选择合适的驱动程序。
services.AddWatchDogServices(opt =>{
opt.IsAutoClear
= true;
opt.SetExternalDbConnString
= "Server=localhost;Database=testDb;
User Id=postgres;Password=root;
";
opt.DbDriverOption
=WatchDogDbDriverEnum.PostgreSql;
});

6、设置访问日志的账号密码

app.UseWatchDog(opt =>{ 
opt.WatchPageUsername
= "admin";
opt.WatchPagePassword
= "Qwerty@123";
});

注意:如果你的项目使用权限验证,那么
app.UseWatchDog();
应该在
app.UseRouting()
,
app.UseAuthentication()
, 和
app.UseAuthorization()
之后按顺序添加。

7、配置说明和示例

  • 黑名单
    :要忽略的路由、路径或端点列表(应为逗号分隔的字符串,如下所示)。
  • 序列化器
    :如果不使用默认的全局 JSON 序列化器/转换器,请指定类型。
  • CORS策略
    :如果项目使用了跨源资源共享(CORS),请指定策略名称。
  • 使用Output缓存
    :如果项目使用了ASP.NET Output缓存。功能仅适用于 .NET 8 及以上版本。
  • 使用正则表达式黑名单
    :启用使用正则表达式来黑名单化请求路由、路径或端点。

示例配置

app.UseWatchDog(opt =>{ 
opt.WatchPageUsername
= "admin";
opt.WatchPagePassword
= "Qwerty@123";//Optional opt.Blacklist = "Test/testPost, api/auth/login";//Prevent logging for specified endpoints opt.Serializer =WatchDogSerializerEnum.Newtonsoft;//If your project use a global json converter opt.CorsPolicy = "MyCorsPolicy";
opt.UseOutputCache
= true;
opt.UseRegexForBlacklisting
= true;
});

8、记录消息/事件

WatchLogger.Log("...Test Log...");
WatchLogger.LogWarning(JsonConvert.Serialize(model));
WatchLogger.LogError(res.Content, eventId: reference);

9、查看日志和异常

启动服务器并访问
/watchdog
来查看日志。

示例

https://myserver.com/watchdoghttps://localhost:[your-port]/watchdog

项目效果

1、WatchDog登录

2、WatchDog 日志

3、请求日志

4、消息/事件

项目地址

Github:
https://github.com/IzyPro/WatchDog

总结

WatchDog 是一款强大且易于使用的.NET开源实时应用监控系统。通过使用WatchDog,我们可以轻松实现对.NET应用的实时监控,提高应用的稳定性和可靠性。希望这篇文章能够帮助你更好地理解和使用WatchDog。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号
[DotNet技术匠]
社区,与其他热爱技术的同行一起交流心得,共同成长!

随着技术的不断进步,开发者们面临着如何在复杂的技术环境中创造出卓越应用的挑战。
在当今的科技浪潮中,如何抓住创新的机遇?
HarmonyOS NEXT的发布,带来了全新的机遇和功能。本文将探讨开发者如何充分利用这些功能,提升开发效率,实现创新,并在竞争激烈的市场中脱颖而出。

HarmonyOS NEXT的核心功能概述

多设备无缝连接

在如今的数字时代,用户对设备间无缝切换的期望越来越高。那么,开发者如何确保用户在多个设备间获得一致的体验?
HarmonyOS NEXT的多设备无缝连接功能正是为了解决这一需求而生
。通过跨设备的实时数据同步和统一的操作界面,开发者可以让用户在智能手机、平板电脑、智能手表等多种设备之间无缝切换。这不仅极大地提升了用户满意度,还为应用在用户日常生活中的使用频率带来了显著提升。

这一功能的实际应用场景包括什么呢?例如,当用户在手机上观看视频时,他们可以随时切换到平板或电视,视频播放进度会自动同步,无需手动操作。这种无缝体验不仅简化了用户的操作步骤,还增强了设备间的互动性,使得用户能够更便捷地享受内容。
开发者在设计应用时,可以利用这一功能,创造出更加流畅和自然的用户体验

AI深度集成

AI技术早已成为推动应用智能化的核心动力。但在开发过程中,如何真正利用AI提升应用的智能化水平?
HarmonyOS NEXT内置了强大的AI功能
,如AIGC(AI生成内容)图像生成和AI声音修复。这些功能不仅使应用更加智能,还大大缩短了开发时间,提高了开发效率。

在具体的应用场景中,AI深度集成如何发挥作用?
举个例子
,在图像处理应用中,AI图像生成功能能够自动将用户的普通照片转化为风格化的艺术作品,无需用户具备专业的编辑技能。对于音乐类应用,AI声音修复技术可以自动去除背景噪音,增强音质,从而为用户提供更佳的听觉体验。开发者们可以借助这些AI工具,创造出更加创新且吸引人的应用,为用户提供更优质的服务。

增强的API接口

开发者日常工作中,最关心的问题之一是什么?无疑是API接口的易用性和功能性。HarmonyOS NEXT推出了一系列全新、增强的API接口,不仅简化了开发流程,还提供了更强的兼容性和灵活性。
这些API接口为开发者提供了更丰富的工具,帮助他们更快速地实现复杂的功能

以一个电商应用为例,开发者可以利用这些增强的API接口,快速实现跨平台支付、实时库存更新以及个性化推荐等功能。
这些功能不仅让开发过程变得更加高效,还提升了用户体验的质量
。对于开发者而言,掌握这些增强的API接口,就像拥有了一把通向更高效开发的大门钥匙。


开发者工具和资源

开发者工具

在应用开发中,开发工具的重要性不言而喻。那么,什么样的工具能够真正提升开发效率?
HarmonyOS NEXT为开发者提供了一整套精良的工具
,包括强大的IDE(集成开发环境)、便捷的调试工具,以及完善的测试平台。这些工具相辅相成,助力开发者更快地实现创意,缩短开发周期。

具体来说,IDE的直观界面和智能代码补全功能,可以显著减少代码编写的时间。而调试工具的实时反馈功能,使得开发者能够迅速发现并修复代码中的问题。
这一整套工具的协同作用,极大地提升了开发效率,使开发者能够专注于创造更加出色的应用

技术文档和支持

技术文档和支持体系对开发者来说有多重要?
HarmonyOS NEXT的技术文档不仅详细介绍了各项功能和最佳实践
,还通过实例说明帮助开发者更快上手。此外,活跃的开发者社区和全天候的技术支持,成为了开发者强有力的后盾。
这使得开发者在遇到问题时能够迅速找到解决方案,确保项目顺利进行

想象一下,在开发过程中遇到问题时,能够立刻找到详尽的解决方案,这对于项目的成功至关重要。
HarmonyOS NEXT的技术支持不仅提供了及时的帮助,还通过社区分享和反馈机制,让开发者们能够共同成长


案例分析

小米智能家居应用的跨设备连接

在实际应用中,HarmonyOS NEXT的跨设备连接功能如何帮助企业取得成功?
小米通过HarmonyOS NEXT实现了智能家居应用的跨设备无缝连接
。这一技术突破,成功解决了用户在多个设备间切换时的延迟问题,使得用户体验大幅提升。

具体而言,小米的智能家居应用通过HarmonyOS NEXT的跨设备连接功能,用户可以在手机、平板、电视之间无缝切换控制智能设备,如灯光、空调等。
实时的设备状态同步和统一的用户界面设计,不仅让用户操作更为简便,还提高了用户对品牌的忠诚度

网易云音乐的AI声音修复功能

如何通过AI功能提升产品的市场竞争力?
网易云音乐采用了HarmonyOS NEXT的AI声音修复功能
,成功提升了用户的听觉体验。这项技术不仅在技术层面取得了突破,还为网易云音乐赢得了市场份额的显著提升。

通过AI声音修复功能,网易云音乐能够有效消除录音中的背景噪音和音质失真问题。
这一创新功能不仅提升了用户的使用体验,还大大节省了人力成本,使网易云音乐在市场竞争中脱颖而出


跨设备应用开发

跨设备功能实现

开发支持多设备协同的应用有多重要?
在设计和实现上,虽然存在一定的复杂性,但HarmonyOS NEXT已经为开发者铺平了道路
。开发者可以利用系统提供的工具和API,轻松实现设备间的无缝连接。

在实际开发中,开发者需要充分理解用户需求,结合HarmonyOS NEXT的技术优势,
创造出流畅、直观的用户体验
。例如,在一个跨设备的游戏应用中,玩家可以在手机上开始游戏,然后在平板或电视上继续,游戏进度无缝衔接。
这一功能极大提升了用户的参与感和体验

开发示例

具体的实现过程会是什么样的呢?为了帮助开发者更好地理解如何在实际中应用这些功能,以下是一个具体的代码示例。
假设正在开发一个需要在手机和电视之间共享视频播放进度的应用
,通过HarmonyOS NEXT提供的API,可以实现两者之间的实时同步。

java
复制代码
// 代码示例:跨设备视频进度同步public void syncVideoProgress(Device targetDevice, int progress) {
    targetDevice.sendMessage("videoProgress", progress);
}

这一简单的代码示例展示了如何在不同设备间实现功能同步,
为开发者提供了极大的灵活性,让用户能够享受更好的使用体验


AI功能的应用

AIGC图像生成

AI生成内容(AIGC)技术在近几年迅速发展
,HarmonyOS NEXT将这一技术直接集成到系统中,使得图像生成变得更加简单和高效。

在摄影类应用中,开发者可以利用AIGC功能,为用户生成风格化的照片。
这一创新功能不仅增加了应用的互动性,还能让用户在社交媒体上分享独特的内容
,进而提高应用的曝光度和用户粘性。想象一下,用户可以随时将普通照片转化为艺术作品,这无疑会为应用带来更高的用户活跃度。

AI声音修复

音频质量对用户体验的重要性不言而喻,尤其是在音乐和语音应用中。
HarmonyOS NEXT提供的AI声音修复功能,能够自动去除背景噪音,增强音频清晰度

这一功能特别适用于社交平台、视频制作和音乐播放应用,为用户提供更加纯净和专业的音质体验。以网易云音乐为例,AI声音修复功能的应用,极大提升了用户的听觉体验。
这一功能不仅为用户提供了更加清晰的音质,还帮助应用在竞争中脱颖而出


结论与实践建议

在竞争激烈的应用市场中,开发者如何才能立于不败之地?

在如今这个技术快速迭代的时代,应用市场的竞争可谓异常激烈。那么,开发者们如何才能脱颖而出,站稳脚跟?
HarmonyOS NEXT 的推出,为开发者带来了强大的工具和前所未有的技术支持,让他们能够在瞬息万变的市场中占据有利位置
。通过掌握这些技术,开发者不仅可以在短时间内实现从 0 到 1 的突破,更能创造出真正打动用户、具有长期生命力的产品。

然而,仅仅依赖技术的优势并不足够。开发者需要具备敏锐的市场洞察力和对用户需求的深刻理解,才能将技术转化为实际的市场价值。
正是因为 HarmonyOS NEXT 提供了多设备无缝连接、AI 深度集成等创新功能,开发者才能更好地捕捉用户需求,并迅速做出反应
。当技术与市场需求紧密结合,开发者才能在竞争中始终保持领先。


实践建议

作为开发者,如何才能最大化地利用 HarmonyOS NEXT 提供的丰富功能和工具?这不仅仅是一个技术问题,更是关于战略和实践的深刻思考。

首先,
深入学习和理解系统提供的 API 和工具,是实现高效开发的基础
。开发者应该通过官方文档、培训资源和案例学习,全面掌握 HarmonyOS NEXT 的技术细节。只有在对这些工具有了深刻的理解后,才能在开发过程中灵活运用,并迅速解决遇到的问题。

其次,
多设备无缝连接和 AI 集成功能是 HarmonyOS NEXT 的核心亮点
,开发者应当充分利用这些功能来提升应用的用户体验。例如,可以在应用中加入 AI 驱动的智能推荐系统,或者通过多设备协同实现无缝的跨平台体验。这样的功能不仅能够增强用户粘性,还能为应用增添独特的竞争优势。

此外,
积极参与开发者社区也是至关重要的一步
。开发者社区是一个共享知识和经验的平台,通过与其他开发者交流,分享开发心得和问题解决方案,开发者能够不断提升自己的技能和知识储备。这种持续的学习和交流,不仅能帮助开发者应对技术挑战,还能让他们保持对最新技术趋势的敏感度,迅速适应市场变化。

最后,开发者应该从实际案例中获得灵感,将理论应用到实践中。
通过运用 HarmonyOS NEXT 的新功能来开发创新性的应用,开发者不仅能增强自身的竞争力,还能为用户带来前所未有的数字体验
。在这个过程中,开发者应该始终关注用户反馈,不断优化和迭代自己的产品,以满足用户不断变化的需求。


通过这些具体的实践建议,开发者们将能够更好地利用 HarmonyOS NEXT 所提供的强大功能,创造出更具创新性和竞争力的应用。未来,随着更多开发者的加入和技术的进一步发展,
HarmonyOS NEXT 将引领更多技术创新,为全球用户带来更加丰富和智能的数字体验
。这不仅是对开发者的激励,更是对整个行业未来发展的美好展望。


下期预告:问界M7 Pro——解读华为智能汽车的最新里程碑

在智能出行领域,华为再度发力!2024年8月,问界M7 Pro重磅发布,搭载了最新的鸿蒙智行系统,智能驾驶体验再上新台阶。下一期,我们将深入解读这款备受瞩目的智能SUV,探讨其在智能座舱、自动驾驶、生态联动等方面的技术亮点,揭示华为如何通过鸿蒙生态圈打造更安全、更智能的出行未来。

敬请期待,我将带您走进问界M7 Pro的世界,揭示这款车背后的创新密码!

如果你了解过 Kafka,那么它用到的一个性能优化技术可能会引起你的注意 -- 操作系统的零拷贝(zero-copy)优化。

零拷贝操作可以避免对数据的非必要拷贝,当然,并非是说完全没有拷贝。

在 Kafka 的场景下,操作系统可以从 page cache 拷贝数据到 socket buffer,直接绕过 Kafka broker 这个 Java 程序。这可以节省一些额外的拷贝,节省一些用户态和内核态的切换。让我们看一个例子。

传统拷贝

如果您的应用程序要从磁盘读取文件并通过网络发送它,则可能会进行一堆不必要的拷贝,以及用户态/内核态的切换。

Kafka 传统拷贝

一些术语:

  • read buffer: 读缓冲区,操作系统的 page cache
  • socket buffer: 套接字缓冲区,OS 用于管理数据包的字节缓冲区
  • NIC buffer: 网卡中的字节缓冲区
  • DMA copy: DMA 是 Direct Memory Access 的缩写,是内存控制器的一个功能,可以避免 CPU 的干预,允许硬件(图形卡、声卡、网卡等)直接访问内存 (RAM) 里的某些数据

在这个例子中,我们有 4 次模式切换(用户态和内核态之间的切换)和 4 次数据拷贝。

  • 应用程序(这里指 Kafka)利用 DMA copy 从磁盘 load 数据到 read buffer(
    用户态->内核态
  • read buffer 到应用程序的缓存区(
    内核态->用户态
  • 应用程序要发数据到网络上,实际是先写到 socket buffer(
    用户态->内核态
  • socket buffer 到 NIC buffer(响应数据写完之后,由内核态返回用户态)

零拷贝

Kafka 零拷贝

为了减少拷贝,把数据从磁盘直接发向网络,那 Kafka 在存储数据的时候,就要保证存储的数据格式和将要发出的 response 格式一致。

在传统拷贝模式下,第二步、第三步没啥意义,因为 Kafka 没有对数据做额外处理,只是简单转发。那能否从磁盘直接发向网络呢?答案是肯定的。通过零拷贝技术,磁盘上的数据还是要先进入 read buffer,然后不用再拷贝到应用程序的缓存区,而是直接拷贝到 NIC buffer,图上的步骤 2:Appends just file descriptors,只是把文件描述符交给了 Socket buffer,实际数据并没有拷贝给 Socket buffer。这就是所谓的 scatter-gather 操作(也称为 Vectorized I/O),scatter-gather 是仅将 read buffer 数据指针存储在 socket buffer 中,并让 DMA 直接从内存读取数据的行为。

最终结果如何呢?

  • 4 次模式切换变成了 2 次
  • 2 次 DMA 拷贝,仍然是 2 次
  • 1 次微小的指针拷贝

Kafka 传统拷贝和零拷贝对比

在 Kafka 中

你可能听过 Kafka 因为零拷贝实现了高性能,但是理想很丰满现实很骨感,零拷贝技术在大部分 Kafka 集群中并没有那么大的影响力。

  • CPU 很少成为瓶颈。网络饱和的速度要快得多,因此在大多数情况下,内存中副本的缺失并不会带来多大的影响。
  • 启用加密和 SSL/TLS 已经禁止 Kafka 使用零拷贝

原文:​​
​https://2minutestreaming.beehiiv.com/p/apache-kafka-zero-copy-operating-system-optimization
​​​
译者:巴辉特,极客时间专栏《运维监控系统实战笔记》作者,Open-Falcon、Nightingale 开源项目发起人,目前创业中,作为
Flashcat
联合创始人,专攻监控/可观测性方向。欢迎和我一起探讨监控/可观测性相关技术和产品。

Daph源码位于gitee,地址是
https://gitee.com/dasea96/daph

概述

Daph的中文名称是大副,大副是职位仅低于船长的船舶驾驶员,甲板部(驾驶部)负责人,船长的主要助手。
Daph的英文名称,取自【有向无环图Directed Acyclic Graph】的第一个字母与最后三个字母。

Daph是一个通用的数据集成与数据处理平台级工具,可用于构建可视化配置化的数据集成与数据处理平台。

Daph,大道至简。
Daph的核心概念是节点,节点具有输入线与输出线,每条线中承载数据,节点承载任意数据处理逻辑。
Daph的核心构件是一个自创的通用DAG数据流引擎,可以流转任意Java/Scala数据结构,可以引入任何基于Java平台或具有Java客户端的数据计算组件作为数据流底层数据计算引擎。
Daph的核心功能是联接多个节点构成DAG图,并流转数据。

功能

  • 全量增量整库整表数据集成
    :以极简配置方式,完成全量增量整库整表数据集成
    • 已支持50多种数据源类型的全量整表同步
    • 已支持Flink-cdc所支持的所有数据源类型的cdc整表同步
    • 已支持mysql/postgresql/oracle/sqlserver/doris/starrocks到mysql/postgresql/oracle/sqlserver/doris/starrocks/hive/iceberg/kafka的全量增量整库同步
  • 流批一体复杂数据处理
    :以极简配置方式,完成流批一体任意复杂多表sql处理逻辑

价值

  • 统一数据开发视图
    :Daph既具有丰富的数据集成能力,又具有强大的数据处理能力
  • 降低数据开发门槛
    :通过配置文件,完成数据开发
  • 缩短数据开发周期
    :开箱即用的海量数据集成与数据处理能力,极简的安装部署方式,极简的二次开发过程

特点

  • 通用
    :可连接任意JVM类型的节点,构成DAG图,并流转任意Java/Scala数据结构。因此,不仅目前能够用于构建DAG数据流,而且具有潜在的任意粒度的DAG任务调度的潜力,可基于一个daph-core,统一任务开发与任务调度,实现一体化的可视化任务开发与任务调度平台。
  • 简单
    :概念简单,配置简单
    • 基于开源计算引擎,不引入新的复杂概念
    • 节点配置简单,比如daph-spark节点配置项,与Spark配置项几乎完全一致,不增加学习开销。
  • 强大
    :架构强大,功能强大
    • 架构层面具有多层环绕运行体系,可定制任意Job级/DAG级/节点级/方法级功能,比如节点数据预览功能、节点监控功能、前置后置SQL功能。目前所有节点均已支持前置后置建表功能,daph-spark所有节点已支持前置后置SQL功能
    • daph-spark仅有5个连接器、6个转换器,却已支持44种数据源的流批读写,且能随时扩充更多数据源;已支持对单表的map、filter、sql处理,对多表的join及任意复杂sql处理;且支持spark能支持的任何catalog
    • daph-flink仅有2个连接器、1个转换器,却已支持任何flink-sql支持的数据源的流批读写;已支持对单表与多表的任意复杂sql处理;且支持flink能支持的任何catalog。
  • 聚焦
    :聚焦于可视化配置化的数据集成与数据处理,聚焦于简化开源计算引擎的使用,不增加学习开销。
  • 流转任意数据结构
    :可流转任意JVM数据结构,比如Java/Scala List、Spark DataFrame、Flink DataStream。
  • 支持多种计算引擎
    :可引入任何基于Java平台或具有Java客户端的数据计算组件作为数据流底层数据计算引擎,比如Java/Scala/Spark/Flink,等等。
  • 快速扩展节点
    :可方便地扩展与部署具有任意逻辑的节点,比如扩展新的连接器节点,以支持读写新的数据库类型;比如扩展新的转换器节点,以便引入特定数据处理逻辑处理数据。只需要完成以下三点,即可完成:
    1)实现一个配置接口与一个功能接口
    2)将扩展的节点对应的jar放在服务器目录
    3)json文件中配置扩展节点信息

对比业界类似软件

Daph:

  1. 既能用于数据集成,又能用于复杂的数据处理
  2. 极致通用的DAG模型,能够流转任意JVM对象,引入任意符合Spark/Flink编程模型的计算引擎
  3. 不重复造轮子,专注于简化开源计算引擎的使用,配置项几乎与开源计算引擎一一对应
  4. 完美运用开源计算引擎的各项能力,包括且不限于流批处理能力、catalog能力、sql能力
  5. 能够及时从开源计算引擎的生态系统中获益
    • 比如Spark,一旦新出现一种数据库连接器,在Daph中只需要在pom.xml中添加依赖,就能立刻使用
对比维度 Daph SeaTunnel StreamSets StreamX Kettle Chunjun
通用性
易用性
开源
数据结构流转能力 所有JVM对象 Dataset[Row]/DataStream[Row]/Zeta数据结构
计算引擎接入能力 任意符合Spark/Flink编程模型的计算引擎 Spark/Flink/Zeta Spark Spark/Flink Java Flink
流水线模型 DAG 线 DAG DAG 线
功能扩展性
学习成本
开发成本
运维成本

架构模型

数据流模型

Daph的数据流模型是DAG数据流模型,如下图所示:

Daph数据流模型

例如一个数据集成与数据处理综合场景,如下图所示:

  • 输入是一张MySQL表、一张Hive表,一张Oracle表
  • 处理逻辑包含map、join、sql、自定义复杂逻辑
  • 输出是一个Hudi表、一个Doris表、一个HBase表

Daph数据流模型示例

运行模型

Daph通过节点包裹代码片段,将节点连成一个DAG图,并最终将DAG图形成一个完整的应用程序。

  • 一个DAG图就是一个完整运行逻辑,比如当使用Spark作为底层计算引擎,一个DAG图就是一个完整的Spark应用程序。
  • 一个DAG图中可以同时包含Java节点、Scala节点、Spark节点,也可以同时包含Java节点、Scala节点、Flink节点,但不能同时包含Spark与Flink节点。
  • 底层计算引擎决定了应用程序的类型。
    JVM引擎对应的就是原生Java/Scala应用程序;
    Spark引擎对应的就是Spark应用程序;
    Flink引擎对应的就是Flink应用程序。

Daph运行模型如下图所示:

Daph运行模型

部署模型

Daph目前的部署模型非常简单,

  • daph-jvm,就是部署原生java程序
  • daph-spark,就是部署spark应用程序
  • daph-flink,就是部署flink应用程序

PyInstaller会在打包时自动为我们收集一些依赖项,特别是我们在打包PyQt/PySide相关的应用时,PyInstaller会自动包含我们程序通常不需要的文件,如'tanslations'文件夹,'plugins/imageformats'等,通常这些文件会使我们最终的exe文件变大。在网上没有找任何好的方法来排除这些文件,从这个Issue
https://github.com/pyinstaller/pyinstaller/issues/5503
里我们可以看到一种方法就是在打包之前先删除PyQt安装目录中的不需要文件,这种做法能达到目的,但在我看来实在是不够优雅。

PyInstaller其实最终都依靠spec文件来获取依赖及其它配置项,而生成spec文件内容是由一个模板(
https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/building/templates.py
)控制, 所以我们可以在生成之前去修改(patch)下这个模板,就可以达到控制依赖项的目的。

以下假设我们是通过代码方式来调用Pyinstaller,并使用onefile模式(onedir模块可参照修改).

注意以下
Analysis
语句后面的代码即为处理datas和binaries的代码,在这里可以添加任何过滤逻辑

import PyInsatller.building.templates as pyi_spec_templates
from PyInstaller.__main__ import run as pyi_build

# copy from PyInsatller.building.templates.py
# add datas and binaries filter after Analysis
onefiletmplate = """# -*- mode: python ; coding: utf-8 -*-
%(preamble)s

a = Analysis(
    %(scripts)s,
    pathex=%(pathex)s,
    binaries=%(binaries)s,
    datas=%(datas)s,
    hiddenimports=%(hiddenimports)s,
    hookspath=%(hookspath)r,
    hooksconfig={},
    runtime_hooks=%(runtime_hooks)r,
    excludes=%(excludes)s,
    noarchive=%(noarchive)s,
    optimize=%(optimize)r,
)

# begin filter any datas you want
datas = []
for dest_name, src_name, res_type in a.datas:
    # 在这里添加过滤逻辑
    datas.append((dest_name, src_name, res_type))
a.datas = datas
# end filter datas

# begin filter any binaries you want
binaries = []
for dest_name, src_name, res_type in a.binaries:
    # 在这里添加过滤逻辑
    binaries.append((dest_name, src_name, res_type))
a.binaries = binaries
# end filter datas

pyz = PYZ(a.pure)
%(splash_init)s
exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,%(splash_target)s%(splash_binaries)s
    %(options)s,
    name='%(name)s',
    debug=%(debug_bootloader)s,
    bootloader_ignore_signals=%(bootloader_ignore_signals)s,
    strip=%(strip)s,
    upx=%(upx)s,
    upx_exclude=%(upx_exclude)s,
    runtime_tmpdir=%(runtime_tmpdir)r,
    console=%(console)s,
    disable_windowed_traceback=%(disable_windowed_traceback)s,
    argv_emulation=%(argv_emulation)r,
    target_arch=%(target_arch)r,
    codesign_identity=%(codesign_identity)r,
    entitlements_file=%(entitlements_file)r,%(exe_options)s
)
"""

pyi_spec_templates.onefiletmplt = onefiletmplate  # ==> patch the template string here

# build exe
pyi_build(['main.py', '--onefile', ...])