什么情况下你能接受 996

news2024/11/12 8:33:56

在当下的职场环境中,996 工作制一直是一个备受争议的话题

“996”是一种工作制度的代称,指的是工作日早上 9 点上班,晚上 9 点下班,中午和傍晚休息 1 小时(或不到),总计工作 10
小时以上,并且一周工作 6 天的工作制度。

有人对其深恶痛绝,认为它严重影响了生活质量;而也有人在某些情况下,能够接受这种工作模式。那么,到底在什么情况下,人们会愿意接受 996 呢?

最近在一个平台上,热榜第一就是这个话题,引来了好多人的讨论。在这话题里,有人说项目到了关键时候,得加班加点赶进度,就愿意接受 996,好保证项目能交付。就像后端开发的时候,碰到紧急上线或者重大系统优化,为了系统稳当、性能好,可能就得花更多时间和精力。

还有人觉得要是公司给的回报和发展机会够多,996 也能接受。比如说在一些技术领域,参加有挑战性的项目,能得到宝贵经验,技能也能提升,对职业发展有好处。
那你呢?你啥时候能接受 996 ?是为了职业目标,还是因为别的?

好了,这个话题就讨论到这里,今天接着更新粉丝投稿的最新面经,应粉丝要求,我把问题和答案一个一个整理好了

内容整理如下(删除了跟项目相关的内容):

遇到过kafka消息积压或者消息丢失的问题吗, 说一下怎么处理?

消息积压
  1. 线上有时因为发送方发送消息速度过快,或者消费方处理消息过慢,可能会导致broker积压大量未消费消息。
  • 解决方案:此种情况如果积压了上百万未消费消息需要紧急处理,可以修改消费端程序,让其将收到的消息快速转发到其他topic(可以设置很多分区),然后再启动多个消费者同时消费新主题的不同分区。如图所示:

  1. 由于消息数据格式变动或消费者程序有bug,导致消费者一直消费不成功,也可能导致broker积压大量未消费消息。
  • 解决方案:此种情况可以将这些消费不成功的消息转发到其它队列里去(类似死信队列),后面再慢慢分析死信队列里的消息处理问题。这个死信队列,kafka并没有提供,需要整合第三方插件!
消息丢失

kafka在生产端发送消息 和 消费端消费消息 时都可能会丢失一些消息

①:生产者消息丢失

  • 生产者在发送消息时,会有一个ack机制,当ack=0 或者 ack=1时,都可能会丢消息。如下所示:
  1. acks=0

表示producer不需要等待任何broker确认收到消息的回复,就可以继续发送下一条消息。性能最高,但是最容易丢消息。大数据统计报表场景,对性能要求很高,对数据丢失不敏感的情况可以用这种。

  1. acks=1

至少要等待leader已经成功将数据写入本地log,但是不需要等待所有follower是否成功写入。就可以继续发送下一条消息。这种情况下,如果follower没有成功备份数据,而此时leader又挂掉,则消息会丢失。

  1. acks=-1或all

这意味着leader需要等待所有备份(min.insync.replicas配置的备份个数)都成功写入日志,这种策略会保证只要有一个备份存活就不会丢失数据。这是最强的数据保证。一般除非是金融级别,或跟钱打交道的场景才会使用这种配置。当然如果min.insync.replicas配置的是1则也可能丢消息,跟acks=1情况类似。

②:消费端消息丢失

  • 消费端丢消息最主要体现在消费端offset的自动提交,如果开启了自动提交,万一消费到数据还没处理完,此时你consumer直接宕机了,未处理完的数据 丢失了,下次也消费不到了,因为offset已经提交完毕,下次会从offset出开始消费新消息。

解决办法就是采用消费端的手动提交。

切片, map, channel的底层结构?

切片:

type slice struct { 
    array unsafe.Pointer // 指向底层数组 

    len int // 长度 

    cap int // 容量 
}

map:

type hmap struct {
   // Note: the format of the hmap is also encoded in cmd/compile/internal/reflectdata/reflect.go.
   // Make sure this stays in sync with the compiler's definition.
   count     int // # live cells == size of map.  Must be first (used by len() builtin)
   flags     uint8
   B         uint8  // log_2 of # of buckets (can hold up to loadFactor * 2^B items)
   noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details
   hash0     uint32 // hash seed

   buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
   oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing
   nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated)

   extra *mapextra // optional fields
}

channel:

type hchan struct {
   qcount   uint           // total data in the queue
   dataqsiz uint           // size of the circular queue
   buf      unsafe.Pointer // points to an array of dataqsiz elements
   elemsize uint16
   closed   uint32
   elemtype *_type // element type
   sendx    uint   // send index
   recvx    uint   // receive index
   recvq    waitq  // list of recv waiters
   sendq    waitq  // list of send waiters

   // lock protects all fields in hchan, as well as several
   // fields in sudogs blocked on this channel.
   //
   // Do not change another G's status while holding this lock
   // (in particular, do not ready a G), as this can deadlock
   // with stack shrinking.
   lock mutex
}

切片它能作为 map 结构的 key 吗?

答案显然是不能的,因为 slice 是不能使用 “==” 进行比较的,所以是不能做为 map 的 key 的。

而且官方文档中也说明了 https://go.dev/blog/maps

As mentioned earlier, map keys may be of any type that is comparable. The language spec defines this precisely, but in short, comparable types are boolean, numeric, string, pointer, channel, and interface types, and structs or arrays that contain only those types. Notably absent from the list are slices, maps, and functions; these types cannot be compared using ==, and may not be used as map keys.

一段代码片段里面有多个 defer的时候,它的执行顺序是什么样?

在 Go 语言中,如果一个函数中有多个defer语句,它们会按照“后进先出”(Last In First Out,LIFO)的顺序执行。也就是说,最后注册的defer函数会第一个执行,而第一个注册的defer函数会最后执行。

defer,它在什么样的情况下能去修改返回值?在什么样的情况下

defer在return之后执行,但在函数退出之前,defer可以修改返回值。下面是一个例子:

func test() int {
        i := 0
        defer func() {
                fmt.Println("defer1")
        }()
        defer func() {
                i += 1
                fmt.Println("defer2")
        }()
        return i
}

func main() {
        fmt.Println("return", test())
}
// defer2
// defer1
// return 0

上面这个例子中,test返回值并没有修改,这是由于Go的返回机制决定的,执行Return语句后,Go会创建一个临时变量保存返回值。如果是有名返回(也就是指明返回值func test() (i int)

func test() (i int) {
        i = 0
        defer func() {
                i += 1
                fmt.Println("defer2")
        }()
        return i
}

func main() {
        fmt.Println("return", test())
}
// defer2
// return 1

这个例子中,返回值被修改了。对于有名返回值的函数,执行 return 语句时,并不会再创建临时变量保存,因此,defer 语句修改了 i,即对返回值产生了影响。

map 它是线程安全的吗?

在 Go 语言中,内置的 map 不是线程安全的。

如果在多个线程中同时对一个普通的 map 进行读写操作,可能会导致不可预测的结果,比如数据不一致、程序崩溃等。

例如,如果一个线程正在读取 map 中的数据,而另一个线程正在删除或添加元素,就可能会出现问题。

如果需要在多线程环境中安全地使用 map ,可以使用一些同步机制,比如使用 sync.RWMutex 来实现加锁保护,或者使用第三方的线程安全的 map 实现。

Redis 实现一个实时更新的排行榜

在 Redis 中,可以使用 Sorted Set(有序集合)来实现实时更新的排行榜。

Sorted Set 中的每个元素都关联一个分数(score),元素会按照分数进行排序。

以下是一个基本的实现思路:

  1. 插入数据
    • 当有新的数据需要加入排行榜时,将数据作为元素,相关的数值(比如得分)作为分数,插入到 Sorted Set 中。
  2. 更新数据
    • 如果需要更新某个元素的分数(比如用户的得分发生了变化),可以使用 ZINCRBY 命令来增加或减少元素的分数,从而实现实时更新。
  3. 获取排行榜
    • 使用 ZRANGE 命令可以获取排行榜的前若干名。
    • 例如, ZRANGE sorted_set 0 9 可以获取排行前 10 名的数据。
  4. 倒序排行榜
    • 如果需要获取倒序的排行榜,使用 ZREVRANGE 命令。

跳表的节点高度是由什么决定的?

在 Redis 中,跳跃表节点的高度是根据幂次定律随机生成的,其值介于 1 和 32 之间。

每次创建一个新跳跃表节点时,Redis 会使用随机算法生成一个介于 1 和 32 之间的值作为level数组的大小,这个大小就是该节点的“高度”,即层数。

这种随机确定节点高度的方式有一定的概率性。通过使用幂次定律,使得较高的层数出现的概率相对较低,从而在保证查找效率的同时,避免了过多的额外内存开销。这样可以在平均情况下实现对数时间复杂度的查找、插入和删除操作,同时又不会因固定的多层结构而导致过高的空间浪费。

这种设计的优点在于,它不需要严格维护相邻两层链表之间的节点个数关系,新插入的节点能根据自身随机生成的层数决定在哪些层的链表上出现。既能提高查找效率,又能较好地应对动态的插入和删除操作,避免了复杂的调整操作,使时间复杂度不会退化到 O(n)。

分库分表

分库分表是一种数据库架构优化技术,主要是为了解决数据库在数据量过大、并发访问过高时出现的性能瓶颈和管理难题。

分库指的是将一个大型数据库按照业务或其他规则拆分成多个独立的数据库,每个库可以部署在不同的服务器上,以减轻单个数据库的负载和提高数据处理能力。

分表则是将一张大数据表按照特定规则拆分成多个小表,比如按照时间、地域、业务类型等进行划分。分表可以是水平分表,即将表中的数据按照行进行分割,分布到多个表中;也可以是垂直分表,即将表中的列按照业务相关性分割到不同的表中。

实现分库分表的方法主要有以下几种:

  1. 基于哈希的分库分表:通过对数据的某个字段进行哈希计算,根据哈希值将数据分配到不同的库表中。
  2. 基于范围的分库分表:按照数据字段的取值范围,如按照时间区间、数值大小范围等进行分库分表。
  3. 基于枚举值的分库分表:根据数据字段的枚举值,如地区、业务类型等进行分库分表。

分库分表的好处包括:

  1. 提高系统的性能和响应速度,减少数据查询和操作的时间。
  2. 增强系统的可扩展性,便于应对不断增长的数据量和业务需求。
  3. 方便数据的管理和维护,降低单个库或表的复杂度。

欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。

没准能让你能刷到自己意向公司的最新面试题呢。

感兴趣的朋友们可以私信我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1966535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSP04 PD诱骗芯片Type-C受电端用电5V9V10V11V12V15V20V,多协议PD+QC+AFC+FCP+SCP+VOOC使用体验

Type-C受电端控制芯片,顾名思义就是应用在用电端,例如3C数码产品、小家电、锂电池快充、小型发热产品等,一般产品使用Type-C接口,需要充电器的快充(如9V以上)供电,就可以使用XSP04 Type-C控制芯…

DevExpress WPF中文教程:如何将GridControl的更改发布到数据库?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

【Linux】全志Tina使用swupdate命令进行ab区分区升级操作

一、代码 swupdate -v -i /ota.swu -e stable,now_A_next_B 二、介绍 首先需具备swupdate命令,没有此命令需使用make menuconfig开启。 其次需指定swu文件的路径,代码中的路径是“/ota.swu”。 之后需要知道当前是分区A还是分区B。 --从A升B&#x…

零基础入门AI:一键本地运行各种开源大语言模型 - Ollama

什么是 Ollama? Ollama 是一个可以在本地部署和管理开源大语言模型的框架,由于它极大的简化了开源大语言模型的安装和配置细节,一经推出就广受好评,目前已在github上获得了46k star。 不管是著名的羊驼系列,还是最新…

程序员转行大模型:从代码到无限可能

在技术日新月异的时代背景下,许多程序员开始思考自己的职业发展路径。面对着人工智能与机器学习领域的迅速崛起,越来越多的技术人员将目光投向了更为广阔的天地——转行成为大模型研究者或开发者。这一转变不仅要求个人技能的迭代升级,更是一…

解锁开发新纪元:GPT-4o mini的实战探索与效率革命

🌈所属专栏:【其它】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…

容器操作基础命令

文章目录 一、启动容器启动容器用法 二、查看容器状态三、容器相关操作删除容器容器的开启和停止进入容器attachexec 暴露容器的端口查看容器的日志传递运行命令容器内部的hosts文件指定容器的DNS容器内和宿主机之间复制文件 一、启动容器 容器的生命周期 docker run可以启动…

JavaEE---Spring MVC(1)

在这之前我们先启动spring 启动spring之前会遇到很多问题,在这里我遇到的问题是没法run,所以我主要是说一下没法run的情况下我们应该怎么办. question 方法一: 这个时候当我们idea的左侧有maven的时候,我们直接点击maven的刷新按钮即可 方法二: 没有maven的时候我们在idea中打开…

论文阅读 -《N-ary Relation Extraction using Graph State LSTM》

摘要 问题定义:跨句n元关系提取是在多个句子中检测n个实体间关系的自然语言处理任务。 现有方法:现有方法通常将文本构建成文档图,包括句子内部和跨句子的依赖关系。 最先进方法:最先进方法将文档图分割为两个有向无环图&#x…

x-cmd pkg | nvim - 命令行文本编辑器,Vim 的一个现代化分支

目录 简介快速入门功能特点Neovim 插件推荐相关竞品进一步阅读 简介 Neovim(简称 nvim)是用 C 语言开发的文本编辑器,是 Vim 的一个现代化分支,更专注于提升可扩展性和提供更现代的用户体验。 它是基于 Vim 源代码的一个衍生版本…

电商运营与大数据分析

电商运营与大数据分析,这两者如何相辅相成,助力企业在激烈的市场竞争中脱颖而出,我们一起来分析一下。 电商运营是指管理和优化电子商务平台的一系列活动,目标是提高销售额和客户满意度。这包括下面这些。 商品管理:有…

链路级资损防控之资损字段防控实践|得物技术

一、背景 资损防控是业务稳定性保障的重要一环,资损防控的核心主要有三点:事前规避、事中发现和事后应急。在资损事前规避方面,商家业务从业务场景入手,进行各业务模块的资损场景的梳理,将最容易出现资损的场景梳理出…

申请专利需要注意什么

申请专利需要注意什么 在知识经济时代,专利已成为企业保护创新成果、提升市场竞争力的重要手段。然而,申请专利并非一件简单的事情,它涉及多个环节和复杂的法律程序。 一、了解专利基础知识 首先,申请人需要学习和熟悉专利法及其实…

FinalShell安装配置及使用教程

文章目录 一、FinalShell简介二、安装下载 三、简单使用四、快捷键 一、FinalShell简介 FinalShell是一款由国内团队开发的免费软件,它不仅是一个SSH工具,更是一款一体化的服务器和网络管理软件。FinalShell以其丰富的功能和易用性,赢得了广大…

Python图形验证码的识别:一步步详解

在Web开发和自动化测试中,图形验证码的识别是一项常见且重要的任务。图形验证码作为防止自动化攻击的一种手段,通过随机生成包含字符或数字的图片来增加用户验证的难度。然而,对于需要自动化处理的场景,如Web自动化测试或爬虫&…

悍高集团销售费用居高不下:多起专利诉讼待解,实控人去年被限高消费

《港湾商业观察》施子夫 自2022年7月IPO获深交所主板受理至今,悍高集团股份有限公司(以下简称,悍高集团)的IPO进程已走过两年时间。 2022年12月,证监会下发反馈意见;2023年3月,深交所发出第一…

提升报价单质量的几个细节 | 全球贸易数据服务 | 箱讯科技

1、报价单的格式至少要两种 提供至少两种格式的报价单,第一种为Word文档,这是供客户修改使用的。但是由于Word文档版本的差别,可能打不开,所以还需提供一个PDF版本。 PDF版本比较正规,是标准的文书。最好再提供一个图…

可靠的图纸加密软件,七款图纸加密软件推荐

大家好啊,我是小固,今天跟大家聊聊图纸加密软件。 作为一名设计师,我深知保护自己的知识产权有多重要。曾经就因为图纸泄露,差点血本无归,那个教训可真是惨痛啊!所以我今天就给大家推荐几款靠谱的图纸加密软件,希望能帮到你们。 固信软件https://www.gooxion.com/ 首先要隆重…

学生信息管理系统(Python+PySimpleGUI+MySQL)

吐槽一下 经过一段时间学习pymysql的经历,我深刻的体会到了pymysql的不靠谱之处; 就是在使用int型传参,我写的sql语句中格式化%d了之后,我在要传入的数据传递的每一步的去强制转换了,但是他还是会报错,说我…

Java延迟任务

什么是延迟任务 我们把需要延迟执行的任务叫做延迟任务,比如业务中用户发送审配,过期后需要执行一些操作,网上订单未支付,红包过期取消等等。 Java API 实现延迟任务 ScheduledExecutorService实现延迟任务 public static voi…