使用 golang 可以开发一套监控系统吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
florentino
V2EX    Go 编程语言

使用 golang 可以开发一套监控系统吗

  •  
  •   florentino 2024-10-08 16:14:22 +08:00 4203 次点击
    这是一个创建于 371 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近接了个活,主要是给 FSU 动环监控单元白盒(芯片:NUC980,内存:128MB),开发一套监控软件,可以采集接在白盒上面的各种 DI,AI 设备的数据,并且上报到监控中心

    查询了下,FSU 系统,好像都是通过 C/C++ 写的,可是我不太会,但是我会一点 golang 写,查询了下,golang 好像可以用于嵌入式开发

    就想问下有没有使用过 golang 开发过类似的软件的,以及使用 golang 会不会有什么坑

    34 条回复    2024-10-28 14:13:38 +08:00
    wangritian
        1
    wangritian  
       2024-10-08 16:17:33 +08:00
    不懂这块业务,但 go 可以读取 dll 或 so ,通过 cgo 调用 c 函数
    sampeng
        2
    sampeng  
       2024-10-08 16:23:11 +08:00   2
    如果连 link 都不明白的是大概率没戏的。
    hefish
        3
    hefish  
       2024-10-08 16:43:12 +08:00   2
    行肯定是行的,但入 2 楼大佬所讲, 怎么也得知道点嵌入式的东西吧。 不然肯定有困难啊。。
    实际 python ,php 都行啊。。。go 自然也行。
    crackidz
        4
    crackidz  
       2024-10-08 16:46:59 +08:00
    FsuOS 不行吧,它支持的是各种驱动,有 Python 支持但限设备
    guanzhangzhang
        5
    guanzhangzhang  
       2024-10-08 16:54:48 +08:00
    prometheus 的 metrics ,
    你的白盒上运行 node_exporter 或者自己开发个
    qq316107934
        6
    qq316107934  
       2024-10-08 16:56:04 +08:00   1
    128MB 内存用 Golang 太容易 OOM 了,不推荐,Golang runtime 对内存分配比较宽松
    florentino
        7
    florentino  
    OP
       2024-10-08 16:58:17 +08:00
    @hefish 我说嵌入式可能不准确,这个盒子厂家提供编译好的 Linux 系统, 我只要写软件跑在上面就行, 我的想法是, 解决我的软件与串口之间的通讯,以及如何将数据上报到数据中心(就是中国铁塔的 B 接口)就行了, 担心的点也就是会不会最后我写完了, 跑起来发现系统资源不够,毕竟才 128M 内存
    florentino
        8
    florentino  
    OP
       2024-10-08 17:00:09 +08:00
    @qq316107934 我的逻辑比较简单,就是采集数据,上报数据, 没有其他更复杂的逻辑, 想着应该够用吧
    sampeng
        9
    sampeng  
       2024-10-08 17:04:20 +08:00
    @florentino 128M 内存居然说是才。。。我看了一眼我手上的 stm32 的板子就 512K 。你别引一堆第三方包,尽量自己维护数据结构,内存都是能算出来的。虚拟机不是个大 sb ,只知道吃完内存才吐。所以要你自己控制和维护。尤其是调用 so 开的口子的时候千万别忘了回收内存之类的。因为大部分的接口都是只是申请了内存,但是释放一定会再给你另一个接口。这是最容易踩的坑。如果你直接是串口+http 。。。。。哪就没 so 啥事了。标准库标准操作。。内存多少都是看得到的。。
    sampeng
        10
    sampeng  
       2024-10-08 17:05:58 +08:00   1
    甚至更简单粗暴一点就是内存直接都是纯静态的。比如全局 1k 大的数组。多少内存都是能算出来的。就没 gc 啥事
    yuedanwork
        11
    yuedanwork  
       2024-10-08 17:07:18 +08:00   1
    嵌入式这内存够了。。。你这盒子本身功能就不多 要那么大内存干嘛

    至于 Go 能有啥坑 都那么多用的了

    最后,真决定用 Go ,请用 TinyGo
    qq316107934
        12
    qq316107934  
       2024-10-08 17:10:30 +08:00
    @florentino #8 少引用第三方 SDK 的话够用的,大不了 OOM 了之后再拉起或者计划性重启。看了下串口通信在 linux 下只需要 syscall 就行了,如果知道协议纯自己写的话,挺方便的,不用引用 so 库。如果要引用的话 cgo 是有点麻烦的,可以看下 SWIG
    scopeccsky1111
        13
    scopeccsky1111  
       2024-10-08 17:13:11+08:00   1
    注意一下处理器架构, 如果引用库的话可能不兼容
    jim9606
        14
    jim9606  
       2024-10-08 17:18:46 +08:00 via Android   1
    行肯定是行的,更多是省不省心,例如 golang 并不是一个对 interprop 友好的语言,要引非 golang 的库会比较麻烦。如果你熟悉 golang ,需求又不存在调三方库全部自己写的那就无太大所谓。
    mengzhuo
        15
    mengzhuo  
       2024-10-08 17:19:51 +08:00   1
    大概看了下 FsuOS 的文档……好口语化啊……

    不建议你在上面开发了,毕竟 Go 已经开始升级最低要求的 Linux 版本(貌似大于 3.0?),硬要开发的话,可以通过“联通白盒化标准”那里的东西进行采集和上报
    Martens
        16
    Martens  
       2024-10-08 17:23:01 +08:00   1
    TinyGo
    florentino
        17
    florentino  
    OP
       2024-10-08 17:30:39 +08:00
    @mengzhuo 嗯 不基于他们, 他们也是 C 写的打包成了系统, 我的软件是在 Linux4.9 上面跑, 就是使用 go 语言实现他们类似的功能,采集数据+告警+上报 就行了
    viayie
        18
    viayie  
       2024-10-08 17:32:40 +08:00
    @mengzhuo 翻了一眼,同感:

    > "当作为仪表控制器软件时,由于 SMDDevice 只是负载采集告警和控制,具体仪表的业务逻辑还需要一个控制器实现,就是这个。"
    R4rvZ6agNVWr56V0
        19
    R4rvZ6agNVWr56V0  
       2024-10-08 17:35:45 +08:00
    @Martens TinyGo 有内存管理缺陷
    Vitumoc
        20
    Vitumoc  
    &nbs;  2024-10-08 17:36:09 +08:00
    要不直接买个能采集动环数据的盒子呢?也不贵来着,肯定比开发便宜
    R4rvZ6agNVWr56V0
        21
    R4rvZ6agNVWr56V0  
       2024-10-08 17:37:21 +08:00
    用 C 实现呗,如果只是读数据、通讯,多简单啊。。。
    florentino
        22
    florentino  
    OP
       2024-10-08 17:58:04 +08:00
    @Vitumoc 给我活的人,就是想卖钱的,他咋可能去采购呢
    mengzhuo
        23
    mengzhuo  
       2024-10-08 18:22:22 +08:00
    @florentino 实在有 C 的需求,又想有 Go 的语法,嗯……

    可以用 v ( 80%跟 Go 很像),就是内存管理得自己配置一下。

    https://vlang.io
    NathanInMac
        24
    NathanInMac  
       2024-10-08 18:26:59 +08:00
    需求这么简单建议和 AI 一起写会儿 C 就好了
    8355
        25
    8355  
       2024-10-08 18:38:34 +08:00
    @florentino #7 要纯原生开发了,github 代码要 copy 出来精简了。
    cmos
        26
    cmos  
       2024-10-08 18:46:13 +08:00   1
    golang 嵌入式,最后还是会回到 cgo 上,那不如一开始就用 c/c++。话又说回来了,嵌入式不用 c/c++,那也得是 rust 顶上,无论如何也轮不到 golang 啊。哪怕是 microopython 和 tiny go ,也都是 demo 尺度上的东西,商业上也没几个人有胆子用。
    yplam
        27
    yplam  
       2024-10-08 19:14:26 +08:00 via Android
    nuc980 感觉大概率用 nor flash ,这个反而是瓶颈
    elechi
        28
    elechi  
       2024-10-09 13:55:12 +08:00
    如果功能就是你说的那么简单,并且系统中也没有其他程序抢内存,是没有问题的,因为我做过
    elechi
        29
    elechi  
       2024-10-09 13:57:35 +08:00   1
    而且也用不到 cgo ,didoaiao 都是文件,go 直接读写文件就行,上传数据都是网络协议了,和 cgo 也没关系
    florentino
        31
    florentino  
    OP
       2024-10-09 14:22:48 +08:00
    @elechi #29 感谢 我看看
    higker
        32
    higker  
       2024-10-09 18:38:34 +08:00
    建议使用 Java21 + graalvm.org 开发
    anviod
        33
    anviod  
       2024-10-11 11:54:59 +08:00   1
    做过, 可行! 可以参考 gobot 项目 https://gobot.io/ 现成的代码示例
    grzhan
        34
    grzhan  
       351 天前
    看需求更接近开发一个上报监控指标的 agent ,逻辑上应该比较简单。
    解决资源问题(内存)可以看下 tinygo ,算是针对嵌入式环境的一个 go 编译器实现,如果没有用不到 go 关键字、反射等特性的话应该问题不大。
    div class="sep20">
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2974 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 14:13 PVG 22:13 LAX 07:13 JFK 10:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86