最新文章

现代应用依赖于 API。 用户登录、下单、上传文档、激活订阅或请求支付,很少只触发一个 HTTP 请求。在每个可见操作的背后,多个服务相互通信、交换数据、更新状态,并等待其他进程完成。 逐个测试端点可以告诉你每个独立组件是否响应。 但它并不能总是告诉你完整的操作是否仍然有效。 这就是 Flowtest 的用武之地。 Flowtest 帮助你创建、执行和监控完整的 API 工作流。它将请求连接成真实的业务旅程,在步骤之间传递信息,验证关键业务响应,并准确显示出错的位置。 与其问: 这个端点在线吗? Flowtest 帮助你回答: 我的用户还能完成他们依赖的操作吗? Flowtest 将一系列 API 请求转化为可测试的业务旅程 测试完整旅程,而非孤立请求 大多数 API 测试工具从请求开始: POST /orders Flowtest 从旅程开始: 认证 ↓ 创建购物车 ↓ 添加商品 ↓ 创建订单 ↓ 确认支付 ↓ 验证最终订单状态 每一步都依赖于前一步。 认证请求产生一个令牌。购物车请求产生一个标识符。订单请求同时使用两者。最后的验证确认系统存储了正确的信息。 Flowtest 允许你将整个操作表示为一个单一工作流。 这为你提供了更真实的 API 视图。一个独立的端点可能成功响应,而整个客户旅程却是断裂的。 例如:...

在将空闲时间投入到 flowtest.io (我希望这将是一项能够彻底改变API测试方式的服务)两个月后,我又重新拾起了 InceptionDB 。 尽管时间已经过去,但我仍清楚地记得当时正在优化性能,心理目标是突破每秒百万次插入(在单个节点上)。百万次并不难超越,但借助AI,我执意要轻松超过百万。实际上,我执意要将其推向更疯狂且不必要的程度,探索各种方案并攻击Inception的不同抽象层。 我重新执行了最后的测试,结果惊人得好像出了什么问题。我选中第一个基准测试: INSERT ,运行它,几乎同时结束。肯定有问题!日志显示在200毫秒内插入了100万条,但我不相信,我以为我关掉了持久化,只工作在内存中,或者没有并发控制导致数据重叠,或者数据发送了但服务器将其丢弃到了/dev/null。 sent: 1000000 took: 182.928406ms Throughput: 5466619.55 rows/sec Closing 'col-1779494946505865611'... http: Server closed 我不信任它,我可以想到一千个理由,但在删除数据库之前设置了一个断点并重新执行。尽管在调试中,结果几乎相同,但现在我有了: /tmp/inceptiondb_bench_811457574/col-1779494946505865611 ,它并非空文件,但只占41MiB。没多想,我将其移动到本地Inception的数据目录,启动它,加载页面,那里就有100万条数据。而且数据似乎也是正确的。 拥有100万文档的基准测试集合 我仍然不相信,创建一个索引,按升序查询,找到了第一个文档 0 。改变顺序,最后一个文档 999999 也在。似乎一切正常。我移开视线,确认自己还在呼吸。 我想到写一篇博客文章,但在此之前重新测试。这次是1000万条。 sent: 10000000 took: 1.078983549s Throughput: 9267981.90 rows/sec Closing 'col-1779498339775263815'... http: Server closed 接近每秒1000万条,估计为410 MiB。显然离磁盘瓶颈还很远,实际测试中磁盘可达9.4 GiB/s,这连5%都不到。 基准测试包含多个测试,用于衡量特定场景的性能: INSERT 、 PATCH 、 REMOVE ,但还有一些我记不清了: INSERTPK 、 INSERTBTREE 、 RETRIEVEBTREE...

实际上,1970年1月1日那天已经过去了。对许多人来说,这只是一个普通的日子,但对另一些人来说,这是时间的起源,也被称为 Unix 时间 ,即从 1970年1月1日 午夜起经过的秒数。 但这次我不想讨论 Unix 时间,而是想谈谈在编写一些 flowtests 给 Cloudflare 的一个服务时发现的一个小细节。这个服务本身并不重要,重要的是我在其中一个请求中收到的 HTTP 头部。它包含一个日期,扰乱了我平静专注的精神状态,以至于我不得不写下这篇文章: expires: Thu, 01 Jan 1970 00:00:01 GMT 这里奇怪的不是过期头部,虽然这不是最现代的方式,但可以理解,它的目的不是为了使缓存失效,而是为了避免资源从一开始就被缓存。为了实现这一点,他们将过期日期设置为过去,而最好的日期莫过于全世界几乎没有电子计算机的那个时刻: Thu, 01 Jan 1970 00:00:00 GMT 。 在任何其他服务中,这一秒的差异可能不会引起我的注意,但我们谈论的是 Cloudflare,是 Cloudflare!那些用熔岩灯墙保护互联网的公司,那些缓解了历史上一些最大 DDoS 攻击的公司,那些建造了 1.1.1.1 的公司,那些大规模使用 HTTP/3 的公司,那些甚至敢于保护用户开放互联网权利免受某些人滥用之害的公司。 这一秒的差异之所以存在,是有原因的,答案很可能与仍在运行并支撑着我们文明的软件中处理数据的编码方式有关。 这种日期格式只是一个接口,一种约定,通过它两个或多个部分交换信息,同时隐藏内部实现的细节。这种格式完全可以表示 1970 年之前的日期,甚至公元 0 年之前的日期。 很可能仍然存在许多或多或少古老的软件,它们在内部将 Unix 时间表示为整数,但还赋予了 0 特殊含义。这种实践非常普遍,不仅限于日期,对于任何类型的数据都是如此。...

In the information age, size isn’t measured in revenue, headcount, or market cap. It’s measured in control — specifically, in control of the world’s data flows. And under that metric, Google isn’t just a large company. It’s the largest force in the digital ecosystem. Because no other organization has built such a...

This was my two-hour project together with my interim Codex — ChatGPT. 👉 https://real-canid.holacloud.app/ ➚ We built a real-time Global Liquidity Dashboard powered by hola.cloud, connecting directly to the Federal Reserve’s FRED API through a custom proxy Lambda. It visualizes key liquidity indicators — ON RRP, TGA, WALCL, USD Broad...

hola.cloud ,我们将一个 MongoDB 3.6 迁移到了不同机器之间。为了确保版本不会出问题,我们使用了相同的官方 Docker 镜像。这里分享两个对我们非常有用的脚本。 export.sh #!/bin/bash # check argument if [ -z "${1:-}" ]; then echo "Use: $0 " exit 1 fi BACKUP_DIR="$1" mkdir -p "$BACKUP_DIR" docker run --rm --network host \ -v $(pwd)/$BACKUP_DIR:/backup \ mongo:3.6 \ bash -c 'mongodump --host 127.0.0.1 --port 27017 --out /backup' import.sh #!/bin/bash set -euo pipefail # check argument if...

Today I decided to test Cloud Code (or Gemini Code Assist), which is Google's alternative to OpenAI's Codex. I made a few changes to the open-source project GoPress . I have the same thoughts about code assistants in general, but there are a few key differences since this one is...

I have been working for large companies for more than twenty years, and I’ve seen many situations where the company tries to adopt a public cloud as its main infrastructure. But it almost never happens. There are many reasons for this, and one of the biggest ones is price. At...

Estoy fascinado con lo que puedo hacer hoy en día con IA. Pero creo que tiene mejor prensa de la que debería. Hace unas pocas semanas, mi amigo Gerardo decidió reescribir uno de los productos que había creado, usando Codex de ChatGPT . Estaba entusiasmado: en apenas unas horas había...

Corría el año 98 y yo merodeaba por el campus de informática de la Universidad Pontificia de Salamanca en Madrid. No recuerdo muy bien cómo —porque en aquella época casi nadie tenía portátil— pero me llegó un meme (aunque entonces no los llamábamos así) que decía: It's not a bug,...

Le he preguntado a ChatGPT 4-0 si sería capaz de saber si un texto ha sido escrito por una IA. [...] basándome únicamente en este fragmento, no puedo determinar de manera definitiva si fue escrito por una IA o un humano sin más información. Chat GPT 4.0 El texto que...
#ia

正如你可能知道的,我喜欢在有空的时候开发一些东西(有时会和 一位朋友 一起)。我有一个长期的副项目叫 HolaCloud,它是一个微型云,提供一些从零开始构建的服务:数据库引擎、API 网关、日志服务、基于 lambda 和容器的计算、认证、对象存储等。这里面充满了纯粹的乐趣和知识。 两年前,我决定部署所有这些内容,并在互联网上公开,使用域名“ hola.cloud ”。界面看起来可能不那么专业,但最好的部分在幕后😄。老实说,我必须明智地利用我仅有的一点时间。 令人惊讶的是,今天 HolaCloud 被从地球上封禁了。显然,某个算法认为我的网站对人们来说过于危险和恶意。尽管该网站仍然在线,但由于一些细节,它就像被隐藏了一样。 1. 它不再出现在谷歌上。 2. 浏览器(Chrome、Brave、Firefox)显示该网站对人们来说过于危险。 我是怎么知道的?我在 YouTube 上收到了第一个警告,因为我有一个视频链接到了 hola.cloud 。挺聪明的,是吧? 该视频链接到了危险页面 在和我的教练(ChatGPT 4o)聊了 30 秒后,她的最佳建议是查看谷歌的网页开发者控制台。 这些页面欺骗用户执行危险操作,例如安装不需要的软件或泄露个人信息。了解更多。 谷歌网页开发者控制台 一个相当了不起的成就,而且没有写一行代码。 事实证明,所有主流浏览器都依赖于谷歌相同的“安全浏览”数据。这意味着单一一家公司就能决定你的网站是生是死。无需搞乱 DNS、托管提供商、ISP,或联系任何权威机构。 HolaCloud 仍然被封禁。如果你知道如何解决这个问题,我真心恳求帮助。 感谢阅读这出戏。祝你有美好的一天 🌈 更新 2025-07-20(第二天) 第二天恢复意识后,我做的第一件事就是打开谷歌,输入 site:hola.cloud 。很多条目又回来了,自然地流入了谷歌的结果页面。 在我尝试的所有浏览器中,那个巨大的红色警告面板(宣告 HolaCloud 有多危险)消失了。甚至我 YouTube 账户上的第一个警告也不见了。 但这还没结束,几分钟后,域名注册机构的一封电子邮件悄悄进入了我的收件箱,内容如下: 尊敬的注册商, [.]cloud 滥用监控系统检测到 hola[[.]]cloud...

#buildinpublic #SeniorGo 从零开始用Golang搭建HTTP服务器 Go语言自带一个健壮、强大且可用于生产的HTTP服务器。而且它非常易于使用,同时又不失灵活性和可配置性,甚至能精确到最微小的细节。 http包包含了一个Server对象,它拥有我们所需的一切。启动它所需的最基本属性是Addr和Handler。 Addr Addr 是服务器将要监听的地址,是一个格式为 :<端口> 的字符串。例如,如果我们想接收网络上任何计算机通过8080端口发来的请求,可以设置为 :8080 或 0.0.0.0:8080 。如果我们在开发时,可以使用 127.0.0.1:8080 ,这样只有本机才能访问(这在Mac上非常有用,可以避免频繁弹出防火墙提示)。 Handler Handler 是一个函数,每当服务器收到HTTP请求时都会被调用。该函数拥有一个 ResponseWriter 用于发送响应,以及一个 Request 用于读取客户端请求。 在接下来的示例中,我们记录HTTP方法和URL的日志,然后返回 "Hello World!!" 作为响应。 package main import ( "log" "net/http" ) func main() { s := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println(r.Method, r.URL) w.Write([]byte("Hello World!!")) }), } err := s.ListenAndServe() if err != nil { log.Fatal(err) } } 如果服务器启动一切顺利,执行将停在 ListenAndServe...

Prueba de GoPress beta version! Sub Header # Soporta markdown? * veamos Con negrita ⚠️ Ops! Warning message table header value other

InceptionDB ,一款类似于 MongoDB 的多功能 NoSQL 数据库,现在包含了一项强大的新功能:“默认值”。此功能允许用户为集合中的新文档定义默认值,从而简化数据录入并确保一致性。 InceptionDB 中的“默认值”功能通过自动使用预定义值填充字段来简化文档创建。这减少了重复数据录入的需求,并有助于维护数据完整性。用户可以为集合中的任何字段指定默认值,确保新文档遵循一致的结构。 如何使用默认值 要为集合定义默认值,用户必须在集合模式中指定所需的默认值。例如: { "name": "my_collection", "defaults": { "status": "pending", "created_at": "2023-01-01T00:00:00Z", "is_active": true } } 当向“my_collection”添加新文档而未指定这些字段时, InceptionDB 将自动使用提供的默认值填充它们。 实际用例:用户注册 在用户注册系统中,你可以为字段设置默认值,例如 status (“pending”)、 created_at (当前时间戳)和 is_active (true)。这确保了所有新用户具有一致的初始状态。 { "username": "johndoe", "email": "johndoe@example.com" } 该文档将存储为: { "username": "johndoe", "email": "johndoe@example.com", "status": "pending", "created_at": "2023-01-01T00:00:00Z", "is_active": true }...

Golang: Unlocking High Performance in Production Systems Introduction In the evolving landscape of software development, selecting the right programming language for production systems is paramount. Over the past six years, with four of those being intensively hands-on, my journey with Golang has underscored its profound impact on developing efficient, reliable,...

A través de un enfoque esquemático y simplificado, este artículo demuestra cómo la introducción de redundancia, evaluando y eligiendo alternativas para las dependencias críticas, no solo puede mejorar significativamente la disponibilidad del servicio sino también transformar las tensiones en reuniones en conversaciones constructivas sobre mejoras y estrategias a futuro. Al...

Viaje a Mordor Era el séptimo día de viaje a lomos de un conejo Uruj-ai convenientemente ensillado para la travesía. La vasta extensión de la llanura de Serindë se desplegaba ante mí, un mosaico de verdes y dorados que se extendía hasta donde alcanzaba la vista. El aire fresco de...

En el mundo acelerado y en constante cambio de la tecnología de la información, las bases de datos NoSQL están emergiendo como un elemento esencial para las empresas que buscan mantenerse al día con la creciente demanda de datos. Las bases de datos NoSQL ofrecen una forma flexible, escalable y...