3作者: r_singh3 个月前原帖
我觉得关于如何思考的话题在未来会变得更加重要,尤其是在我们有了人工智能之后,对软件的依赖也将上升到一个新的层次。因此,由于我在Hacker News上总能得到很棒的推荐,我不得不在这里提问。
3作者: abelanger3 个月前原帖
大家好,我是来自Hatchet的亚历山大。我们正在构建一个开源平台,用于管理后台任务,底层数据库使用Postgres。 一年多前,我们推出了Hatchet,这是一个基于Postgres的分布式任务队列,采用100% MIT许可证([链接](https://news.ycombinator.com/item?id=39643136))。我们从HN社区获得的反馈和反响非常热烈。在推出的第一个月,我们在平台上处理了大约20,000个任务——如今,我们每分钟处理超过20,000个任务(每月超过10亿个)。 如此快速的扩展是非常困难的——Hatchet中的每个任务至少对应5个Postgres事务,我们在Hatchet Cloud实例上看到的任务峰值超过每秒5,000个任务,这大约对应每秒25,000个事务。事实证明,简单的Postgres队列利用FOR UPDATE SKIP LOCKED在这个规模上并不够用。在配置了CloudSQL提供的最大实例类型后,我们甚至讨论过是否将部分负载转移出Postgres,转而使用一些流行的技术,如Clickhouse + Kafka。 但我们选择了继续使用Postgres,并花了大约6个月的时间学习如何大规模操作Postgres数据库,同时在通勤和夜间阅读Postgres手册及其他资源[0]。我们坚持使用Postgres有两个原因: 1. 我们希望让Hatchet尽可能便携和易于管理,认为在Hatchet Cloud上实现我们自己的存储引擎在最好的情况下也不够真诚,最坏的情况下会使我们偏离开源社区的关注点。 2. 更重要的是,Postgres是通用的,这使得它在某些类型的工作负载上既优秀又难以扩展。这也使我们能够提供一个通用的调度平台——我们大量利用Postgres的功能,如事务、SKIP LOCKED、递归查询、触发器、COPY FROM等。 这就引出了今天的主题。我们宣布对Hatchet引擎进行全面重写——仍然基于Postgres——以及我们构建在底层队列之上的任务调度层。具体来说,我们推出了: 1. 基于DAG的工作流,支持更广泛的条件,包括睡眠条件、基于事件的触发和基于父输出数据的条件执行[1]。 2. 持久执行——持久执行是指函数通过缓存中间结果并在重试时自动重放这些结果的能力。我们称具备这种能力的函数为持久任务。我们还支持持久睡眠和持久事件,您可以在这里了解更多[2]。 3. 队列功能,如基于键的并发队列(用于实现公平排队)、速率限制、粘性分配和工作者亲和性。 4. 在我们测试的每个维度上都提高了性能,我们将其归因于对Hatchet架构的六项改进:基于范围的时间序列表分区、基于哈希的任务事件分区(用于更新任务状态)、将监控表与队列分开、缓冲读写、将所有高容量表切换为使用身份列,以及积极使用Postgres触发器。 我们还移除了RabbitMQ作为自托管的必需依赖。 我们非常欢迎您的反馈,并希望您有机会尝试Hatchet。 [0] [Postgres文档](https://www.postgresql.org/docs/) [1] [条件工作流文档](https://docs.hatchet.run/home/conditional-workflows) [2] [持久执行文档](https://docs.hatchet.run/home/durable-execution)
1作者: vincelt3 个月前原帖
嘿,朋友们, 我目前正在学习普通话,并寻找一种每天都能期待的阅读练习方式。分级读物很快就会让人感到无聊,而普通书籍对我来说又太难了。 漫画和网络漫画是完美的格式:有趣、对话风格,包含俚语。但不幸的是,它们与传统的语言学习应用(如linq、language reactor、migaku等)不兼容,手动查找文本会严重干扰阅读体验。 所以我制作了一个小的Chrome扩展,它可以对漫画进行光学字符识别(OCR),翻译它们,并在对话框上方叠加弹出窗口,方便阅读。 我还制作了一个可以在Kindle浏览器中运行的版本,通过构建一个非常优化/有限的网页,确保不会使功能非常有限的Kindle浏览器崩溃。 也许对这里的一些人会有用 :)