JohnsonLu
24 posts


最近一直在找 Agent Dynamic Workflow 的替代方案。
一开始是沿着 Temporal 这条线找的。Temporal 很强,但如果只是想把 agent、脚本、数据处理、运维任务动态串起来,有时候会觉得整套体系有点重。
然后翻到了 Dagu,感觉方向很对。
单个 binary 就能跑,流程用 YAML 写,本地文件管理,带 Web UI,也不用额外起 DB 或 broker。
内置动作也挺多:shell、Docker、K8s Job、SSH 这些都有。比较惊喜的是还有 harness.run,可以直接把外部 coding agent CLI 接进流程里。
我喜欢它的点是:流程本身就是文件,状态、日志、重试、依赖和界面都帮你兜住了。
对小团队、私有环境、个人自动化,还有 agent workflow 来说,Dagu 这种本地优先的路线反而很舒服。
github.com/dagucloud/dagu

中文

@NorthofGray 你看当年 Facebook 当年做 Cassandra 就坑了 Twitter 啊。做出来后说 Cassandra 各种好,Twitter 全面入坑后 Facebook 说自己遇到了各种障碍,决定不用了。
中文

很多大公司会写好好看的技术博客,但如果你用这上面的文章来研究大公司的技术演化史的话,信三成就好了。很多时候技术博客都是为了树立形象而写的,把事情写得很简单也很美好。
举个例子,很多年前 Airbnb 写了一篇很出名的 SDUI (Server Driven UI) 的文章。看起来他们做得很成功,原来客户端写死必须要经过 Apple/Google 审核才能更新的界面代码,现在都变成服务器端驱动了。想要更新界面,随时在服务器端改代码就行。想要做 A/B 测试,服务器端就能把两个版本写了,不需要等客户端更新。 medium.com/airbnb-enginee…
我后来找 Airbnb 的朋友说,想要跟他们学习一下他们做 SDUI 的经验,结果别人说这篇博客上所写的技术完全没办法在公司内推开。原因很简单:产品只想把屏幕中的一小部分改为 SDUI 试试,但框架要求整个屏幕用 SDUI 重写,产品自然不愿意。
当时我的朋友说,Airbnb 又在做一个新的框架,支持只替换产品屏幕中的局部,希望能够被产品接受。这件事情后来不知道怎么样了,反正也没见到 Airbnb 发新的博客文章了。
所以大公司的技术博客只能用来满足猎奇心,要知道真正发生了什么事情,还是要找在公司里面亲身经历过的人来了解。
Cat Chen, @[email protected]@CatChen
Facebook 在从 Git 迁移到 Mercurial 之前就有 stacked diff,而且已经用了很多年。一开始用 Git 的时候,后端其实是个 SVN,只是把前端桥接为 Git,但这不妨碍大家用 stacked diff,因为整个产生 diff 的操作发生在 Git 以外。 Facebook 一直没有公开它魔改过的 Arcanist 和 Phabricator,这才是实现 stacked diff 的核心。在 Arcanist 之后 Facebook 做了 Jellyfish 作为新的客户端,但依然没有对外公开。 Jellyfish 基于 Mercurial 客户端和 Phabricator 服务器端,没办法公开给 Git + GitHub 的用户使用,于是有人做了概念上相似但又兼容 Git 的 Sapling。Facebook 内部其实不用 Sapling。(这不是唯一一个公开版本只公开概念但不公开内部源代码的东西,还有哪些你就猜吧。)
中文

@mjovanovictech use source generator, e.g. ServiceScan.SourceGenerator is better
English

𝗛𝗼𝘄 𝘁𝗼 𝗔𝘂𝘁𝗼𝗺𝗮𝘁𝗶𝗰𝗮𝗹𝗹𝘆 𝗥𝗲𝗴𝗶𝘀𝘁𝗲𝗿 𝗠𝗶𝗻𝗶𝗺𝗮𝗹 𝗔𝗣𝗜𝘀 𝗶𝗻 𝗔𝗦𝗣𝗡𝗘𝗧 𝗖𝗼𝗿𝗲
Manually registering minimal APIs works. But it doesn’t scale.
Want a cleaner, automated approach?
✅ Define API modules as static classes
✅ Use reflection to scan and register all MapEndpoints methods
✅ Centralize registration in a loop
This gives you:
- Consistent structure
- Easier modularization
- Less repetitive setup
I show the exact setup + code here: milanjovanovic.tech/blog/automatic…
How are you organizing your minimal APIs?
---
Tired of writing the same boilerplate code for every new project? Skip the setup and start building features immediately with my Clean Architecture template: milanjovanovic.tech/templates/clea…

English

@mjovanovictech I would send the outbox event immediately after the transaction committed in fire-n-forget mode. this will reduce the latency of event but still ensure the event is published
English
JohnsonLu retweetledi

📌 When did your "aid" to China begin? After the full-scale invasion, massacres, plunder, and bacteriological warfare of 1937?
📌 How much war reparations did you renege on after the war? China voluntarily waived all war reparations under the UN-drafted peace agreement; how much profit did you reap for free?
📌 Over 70% of your so-called ODA aid flowed back to Japanese companies. You profit from the Chinese market and then pretend to be benefactors?
📌 You keep saying "China is ungrateful," but do you even remember the names of the Nanjing Massacre victims?
You think you can rewrite history linguistically by constantly whitewashing, feigning innocence, and spouting the "aid theory."
But you've always been mistaken about one thing: forgetting is what you want, not an obligation for the Chinese people.
The louder you defend yourselves, the more every Chinese person is reminded of:
Who treated aid as a favor, while dismissing massacre as a misunderstanding?
Who continued to plunder China's economic interests under the guise of "friendship"?
Who, after being forgiven, turned around and complained that China was "ungrateful"?
This distorted view of cause and effect is a continuation of fascist mentality.
What you want is never reconciliation, but to reclaim the narrative power.
But you forget: China has not forgotten.
Every generation of Chinese people has sworn under the shadow of history to never again be a forgiven victim, nor to let the next generation learn silence through humiliation.
Every page of lies you rewrite becomes a deeper wound in our memory.

門田隆将@KadotaRyusho
中国が窮地の際に常に手を差し伸べてきた日本。3兆6600億円に及ぶODAを始め、中国の発展の為に数多の日本人が献身した。惜しげもなく長い時間をかけて培った技術を提供し、中国人留学生を厚遇して祖国に貢献できるように育てた。だがその国に“反日憎悪教育”で応え、恩を仇で返す国。この事実は忘れまい
English

@mjovanovictech Which Saga implementation do you prefer: MassTransit or Rebus? And why?
English

Coordinating long-running workflows across services is hard.
You need to track state, handle retries, and recover from failures.
That’s exactly where the Saga pattern shines.
And in .NET, Rebus makes it easier than you might think.
In my setup, I configured:
• Message routing
• RabbitMQ for transport
• SQL Server for saga and timeout persistence
If you're building distributed systems, this is a pattern worth learning.
I put together a full guide to get you started: milanjovanovic.tech/blog/implement…
Have you used Sagas in your projects?
---
Do you want to simplify your development process? Grab my free Clean Architecture template here: milanjovanovic.tech/templates/clea…

English

Two patterns every distributed system should consider:
1. 𝗢𝗿𝗰𝗵𝗲𝘀𝘁𝗿𝗮𝘁𝗶𝗼𝗻 – centralized control; one service coordinates the flow
2. 𝗖𝗵𝗼𝗿𝗲𝗼𝗴𝗿𝗮𝗽𝗵𝘆 – decentralized; services react to events independently
The trade-offs?
Orchestration offers more control, but tighter coupling.
Choreography scales better, but adds complexity in coordination.
Choosing between them depends on how much control, coupling, and autonomy your services need.
Here’s a deeper breakdown of both approaches:
milanjovanovic.tech/blog/orchestra…
Which one would you choose and why?

English

平时觉得微信、QQ 的截图功能过于简单,可以看下 Flameshot 这款开源的截图工具,已斩获了 26.5k Star!
它不仅能快速截图,还内置了完整的编辑功能,画箭头、加文字、打马赛克一气呵成,甚至能直接上传分享。
GitHub:github.com/flameshot-org/…
主要功能:
- 支持多种绘图工具:铅笔、箭头、矩形、圆形等
- 内置文字添加和像素化打码功能
- 快捷键操作,支持延时截图和全屏截图
- 一键上传到 Imgur 或复制到剪贴板
- 自定义外观和颜色,适应个人习惯
跨平台支持 Linux、Windows、macOS 系统,提供开箱即用安装包,可在其官网上下载。
中文














