基于Dockerfile构建容器镜像的最佳实践 (www.ssgeek.com)
本文简要分析了Dockerfile为什么这么大的几个主要原因,并且根据生产经验罗列了一些优化镜像大小的措施以及其他方面常用的处理办法,很多技巧性的内容,比较杂乱,就不一一提及了 ~
by @技术头条 2023-05-02 18:10 查看详情
基于ack k8s集群调度的方案设计 (www.ssgeek.com)
本文分析介绍基于ack,结合k8s原生调度方式,综合考虑现有应用自身特性、节点池资源特性、成本、效率等方向而设计的调度规范参考。

后续随着业务的复杂性增强,会将更多的调度设计原理与业务相结合,充分利用公有云及k8s的新生特性,例如在离线业务混合部署、拓扑感知调度、二次调度、弹性容器实例ECI、Serveless函数计算等,甚至于出现可用的调度方式都不满足的调度需求,实现自定义调度,进而实现更多更好更强贴近业务、使用效率提升的服务调度方式,根据更多的数据指标和服务中链路的追踪来进一步优化业务,最终实现业务的快速迭代、自动部署、独立高效。
by @技术头条 2023-05-02 18:10 查看详情
创业公司的基层管理 (hiwannz.com)
在创业公司担任管理者时,是不能照搬大公司的管理制度和流程的。

一方面是因为公司规模不同,导致能够使用的资源有限,很多创业公司在照搬大公司的管理制度时,往往会听到员工吐槽“又要 996,又不给加班费;又没有大公司的命,又得了大公司的病”。毕竟创业公司总是人手有限,管理者除了担任管理职能以外,往往还需要真的做事,如果在一家几十个人的创业公司里,管理者的工作就是看日报,盯工时和开会,那对于基层员工将会是一件很无奈的事情(毕竟创业公司里要做的事情总是太多了)。

以我个人的经验来说,在这种时候,相比选择花费时间去学习管理课程/书籍,参与 MBA 的课程能够起到的作用并不大(并不是说不好)。毕竟“纸上得来终觉浅,绝知此事要躬行”,管理课程书籍中提供的往往是那种“正确但又难以在短时间内落地的知识”,而由于不同公司的企业文化,组织结构和可用资源,很难找出一种对所有公司都有效的“具体方法”。

在之前的文章《如何管理新的产品团队》中,我分享了一些以往的心得和经验,刚好最近又有一些新的想法,与大家进行分享。
by @技术头条 2023-05-02 18:09 查看详情
一个西漂打工人的求职心路 (blog.yuanpei.me)
一个 30+的朋友和我说,他想自己干点啥,因为他觉得他再找工作就没人要了,也许生活就是永远这么充满变化吧,就像不变的只有变化本身一样,提前焦虑未来没有什么用,现在的规划将来不一样会按部就班,我只能说,多去想想自己有什么,如果你只是比别人能加班,这实在算不上什么过人的长处,因为随时有年轻人可以替换你下来。人活着啊,不能光长年龄和皱纹,想想两度背水一战的丁辉,我们这点努力能叫做拼尽全力吗?这就是我,一个“西漂”四年的外地打工人的一点想法,如果你有更好的解决“内卷”的思路,我会非常感谢你告诉我这些。
by @技术头条 2023-05-02 18:08 查看详情
使用 dotTrace 对 .NET 应用进行性能分析与优化 (blog.yuanpei.me)
前几天,有位朋友问我,你平时都是怎么去排查一个程序的性能问题的啊。说到性能问题,可能大家立马会想到类似并发数、吞吐量、响应时间、QPS、TPS等等这些指标,这些指标的确可以反映出一个系统性能的好坏。

可随着我们的系统结构变得越来越复杂,要找到这样一个性能的“损耗点”,同样会变得越来越困难。在不同的人的眼中,对于性能好坏的评判标准是不一样的,譬如在前端眼中,页面打开速度的快慢代表着性能的好坏;而在后端眼中,并发数、吞吐量和响应时间代表着性能的好坏;而在 DBA 眼中,一条 SQL 语句的执行效率代表着性能的好坏。更不用说,现实世界中的程序要在硬件、网络的世界里来回穿梭了,所以,从 80%的功能堆积到 100%,是件非常容易的事情;而从 80%的性能优化到 85%,则不是件非常轻松的事情。

想清楚这一点非常简单,因为我们的系统从来都不是简单的1 + 1 = 2。此时,我们需要一个性能分析工具,而今天给大家分享的是 JetBrains 出品的 dotTrace 。
by @技术头条 2023-05-02 18:05 查看详情
一道 HashSet 面试题引发的蝴蝶效应 (blog.yuanpei.me)
今天要说的是 HashSet ,而这确实是一个实际面试中遇到的问题。当时的场景大概是这样的,面试官在了解了你的知识广度以后,决心来考察一番你的基本功底,抛出了一个看起来平平无奇的问题:说一说你平时工作中都用到了哪些数据结构。你心想,这还不简单,Array、ArrayList、List、Dictionary、HashSet、Stack、Queue…等等各种集合类简直如数家珍,甚至你还能说出这些数据结构间的优劣以及各自使用的场景。可没想到,面试官话锋一转,直接来一句,“你能说说 HashSet 去重的原理吗”,好家伙,你这简直不按套路出牌啊…
by @技术头条 2023-05-02 18:04 查看详情
WebApiClient 中动态路由的实现与使用 (blog.yuanpei.me)
博主曾介绍过.NET 平台下的“Retrofit”——WebApiClient,它是一种声明式的 RESTful 客户端,通过动态代理来生成 Http 调用过程代码,而调用方只需要定义一个接口,并使用相关“注解”对接口进行修饰即可,类似的实现还有Refit,是一种比 HttpWebRequest、HttpClient 和 RestSharp 更为优雅的接口调用方式。在今天这篇博客中,我想聊聊 WebApiClient 中动态路由的实现与使用。
by @技术头条 2023-05-02 18:04 查看详情
Zookeeper的基本原理 (codeyee.com)
在学习Zookeeper之前,我们需要先了解什么是分布式协调技术,以及该技术产生的背景是什么。

分布是协调技术主要用来解决分布式环境中多个进程(节点)之前的同步控制,让他们 有序 的区访问某种 “临界资源” ,防止出现 “脏数据” 的情况。
by @技术头条 2023-05-02 18:02 查看详情
利用GitHub Actions自动将项目贡献者列表添加到README中 (wiki.eryajf.net)
当我们负责的项目有越来越多的人加入进行协作之后,将贡献者添加到 README 中是一个很好的激励作用,很多大的项目也都是这么做的,本文就来讲一下,如何借助 Github Actions 自动将项目贡献者列表添加到 README 中。
by @技术头条 2023-05-02 18:00 查看详情
一个诡异的 Pulsar InterruptedException 异常 (crossoverjie.top)
背景今天收到业务团队反馈线上有个应用往 Pulsar 中发送消息失败了,经过日志查看得知是发送消息时候抛出了 java.lang.InterruptedException 异常。和业务沟通后得知是在一个 gRPC 接口中触发的消息发送,大约持续了半个小时的异常后便恢复正常了,这是整个问题的背景。

最后归根结底发现是代码不合理导致的,首先是自己中断了线程但也没使用,从而导致有被其他基础库使用的可能,所以会造成了一些不可预知的后果。

再一个是不建议在业务代码中使用 Thread.currentThread().interrupt(); 这类代码,第一眼根本不知道是要干啥,也不易维护。

其实本质上线程中断也是线程间通信的一种手段,有这类需求完全可以换为内置的 BlockQueue 这类函数来实现。
by @技术头条 2023-05-02 17:59 查看详情
Jenkins-Groovy中三元表达式的用法 (wiki.eryajf.net)
我们在使用pipeline的时候,如果某一个变量没有正常声明,则会遇到变量定义失败的错误,这个时候,我们可以借助三元表达式来解决这个问题。
by @技术头条 2023-05-02 17:58 查看详情
Jenkins结合MySql Database插件的平台化实践思路 (wiki.eryajf.net)
以往Jenkins实践当中,配置了共享库的流水线方案,通过将核心公共逻辑抽离成膜版,项目个性化配置信息放到引导文件中的方式进行推进。这种方案没有什么毛病,对于运维的维护工作也是比较友好的,只是后来我们打算再在Jenkins上层做一下平台化封装的时候,发现还是存在一些问题,并且有一些难度的。最近我了解学习到了一个与 MySQL Database 插件结合的思路,能够比较好解决这种问题,那么接下来话不多说,直接进入正题,让我们来认识一下这个插件。
by @技术头条 2023-05-02 17:57 查看详情
Linux 网络工具中的瑞士军刀 - socat & netcat (thiscute.world)
netcat(network cat) 是一个历史悠久的网络工具包,被称作 TCP/IP 的瑞士军刀,各大 Linux 发行版都有默认安装 openbsd 版本的 netcat,它的命令行名称为 nc.

而 socat(socket cat),官方文档描述它是 "netcat++" (extended design, new implementation),项目比较活跃,kubernetes-client(kubectl) 底层就是使用的它做各种流量转发。

在不方便安装 socat 的环境中,我们可以使用系统自带的 netcat. 而在其他环境,可以考虑优先使用 socat.
by @技术头条 2023-04-29 21:00 查看详情
我在创业公司做技术一年多的一点体会 (thiscute.world)
公司的技术骨干们都是创业思维,他们或者乐在其中,或者愿意为了老板描述的未来忍一时痛苦。他们都愿意为了产品付出更多。 但是我发现对公司,我不愿意付出太多。在这里,我一直就是个普通上班族的想法,高点工资,多点个人时间,做着自己喜欢的事情。
by @技术头条 2023-04-29 20:59 查看详情
解决Blazor Server读取localstorage内容过大无响应的问题 (blog.wixy.cn)
最近在用blazor server对接OpenAI的api,开发自己的ChatGPT网页,这边设计的是聊天内容存储在浏览器的localstorage里面,每次打开网页的时候获取聊天记里并渲染界面。

在开发和使用期间,偶发的会进不进去网站,也没发现有报错,最后清理浏览器缓存解决了问题。

最近这两天使用的比较频繁,发现这个问题出现的概率有点高,最后定位下问题,发现是聊天记录获取的时候出现的问题,在Blazor中调用js的获取数据方法时程序就挂起了,没有继续往下执行,刚开始怀疑是不是存储方法或者json序列化的问题,换了写法,也不能解决问题。
by @技术头条 2023-04-29 20:57 查看详情
Chromium 渲染流水线——字节码到像素的一生 (me.ursb.me)
在开始介绍渲染流水线之前,我们需要先介绍一下 Chromium 的浏览器架构与 Chromium 的进程模型作为前置知识。
by @技术头条 2023-04-29 20:56 查看详情
使用 Dynamic Linq 构建动态 Lambda 表达式 (blog.yuanpei.me)
相信大家都有这样一种感觉,Linq和Lambda是.NET 中一以贯之的存在,从最早的 Linq to Object 到 Linq to SQL,再到 EF/EF Core 甚至如今的.NET Core,我们可以看到Lambda表达式的身影出现地越来越频繁。虽然 Linq to Object 和 Linq to SQL,分别是以IEnumerable<T>和IQueryable <T>为基础来实现的。我个人以为,Lambda呢,其实就是匿名委托的“变种”,而Linq则是对Lambda的进一步封装。在System.Linq.Expressions命名空间下,提供大量关于表达式树的 API,而我们都知道,这些表达式树最终都会被编译为委托。所以,动态创建 Lambda 表达式,实际上就是指从一个字符串生成对应委托的过程,而一旦这个委托被生成,可以直接传递给 Where()方法作为参数,显然,它可以对源数据进行过滤,这正是我们想要的结果。
by @技术头条 2023-04-29 20:56 查看详情
Linux好用命令之watch命令 (wiki.eryajf.net)
watch命令能够将其他命令的输出定时输出到终端,从而实现监听的能力,在我们要对一些命令状态进行实时监听的场景中,有非常好的应用场景。
by @技术头条 2023-04-29 20:55 查看详情
基于Zookeeper的分布式锁原理 (codeyee.com)
临时顺序节点 结合了 “临时节点” 和 “顺序节点” 的特性:在创建节点时 Zookeeper 根据创建的时间顺序给该节点进行编号,并根据该编号的顺序去分配临界资源的访问顺序,当创建节点的客户端与 Zookeeper 断开连接后,临时节点也会被删除。
by @技术头条 2023-04-29 20:54 查看详情
浅淡JAVA虚拟机(JVM) (codeyee.com)
为什么要学习 JVM ?
1、能够明白为什么Java最早期被称为解释型语言,而后来为什么又被大家叫做解释与编译并存的语言(了解JVM中解释器以及即时编译器就可以回答这个问题);
2、你能够理解动态编译与静态编译的区别,以及动态编译相对于静态编译到底有什么好处(JVM JIT);
能够利用一些工具,jmap, jvisualvm, jstat, jconsole等工具可以辅助你观察Java应用在运行时堆的布局情况,由此你可以通过调整JVM相关参数提高Java应用的性能;
3、可以清楚知道Java程序是如何执行的;
4、可以明白为什么Java等高级语言具有可移植性强的特性。 其实这个问题相当于“为什么C/C++程序员需要学体系结构与编译原理?“
5、能够知道你的头发是怎么没有的。
那么来开始吧。

by @技术头条 2023-04-29 20:54 查看详情