介绍一下自己做了哪些?

字节青训营项目你怎么实现的RocketMQ延迟消息订单关单?page 33

在订单创建之后,把订单作为一条消息投递到RocketMQ,并将延迟时间设置为30分钟,30分钟后定义的consumer可以消费这个消息,检查用户是否支付了这个订单。缺点是RocketMQ太重,要处理消息丢失、幂等性复杂问题。

延迟消息是消息写入broker后,不会立刻被消费者消费。

你的抖音商城项目,订单未支付自动关闭详细介绍一下,它会在什么情况下产生,服务端是怎么处理的?(讲讲抖音商城项目中订单未支付自动关闭的触发条件和服务端的处理流程?)(B站)page 1

业务场景。1.下单后未付款。订单处于等用户完成支付窗口期。2.支付过程中断。用户主动放弃或网络异常,系统也应自动关闭。

服务端处理。1.状态保存和延时消息。(1)订单状态记录,订单创建时,后端将订单状态标记为未支付,保存截止支付时间戳。(2)延时消息队列。系统下单时向mq发送延时消息,该消息在到期后被消费。消费者用订单号去数据库查订单状态,如仍未支付,则触发自动关闭逻辑。比定时任务QPS高。2.自动关闭。(1)订单状态检查,延时消息到达时,服务端再次查询订单状态,为防止并发冲突,如用户在支付确认和关闭消息同时到达,要采取措施,如乐观锁,在更新订单状态时用乐观锁检测版本号。幂等设计,自动关闭必须幂等。(2)业务补偿。关闭订单不仅把状态关闭,还要库存回退。

讲讲gRPC,从网络协议,数据压缩,数据传输介绍一下?(B站)page 1

网络协议。gRPC基于http2,支持多路复用,相比http1.1+json,二进制帧传输数据。

数据压缩。默认用gzip压缩算法减少数据体积。

数据传输。1.gRPC用protobuf作为idl。2.消息帧结构,gRPC消息由头部(5字节)和消息体。头部包括一个标志位标识是否压缩和4字节的消息长度。消息体是序列化的二进制数据。

gRPC为什么用protobuf,不用XML,不用json?(B站)page 1

高效二进制序列化。protobuf用二进制格式,比XML和json文本格式更紧凑。

定义和自动生成代码。protobuf用idl描述数据结构。

兼容性。protobuf考虑接口演进,新增字段不会破坏旧版客户端解析,删除或重命名字段也能处理。

字节青训营项目你的高并发下库存超卖少买问题怎么实现的?(如何解决高并发下的库存抢购超卖少买问题?)(解决超卖问题的思路)(一个商品1000万库存,20w秒杀,只用设计减库存环节)(美团)page 1

如果是简单int类型数据,可以用原子操作保证数据准确。 如果是复杂数据结构或多步操作,用加锁保证准确。 1.锁在获取时要循环等待,且参与争抢的线程越多,情况越糟糕,通讯和等待会造成系统不稳定。对此,将库存放在独立内存缓存redis中。 同时,也避免用DB行锁保证库存,因为DB资源很珍贵。 当有大量用户并行修改一个变量时,只有锁能保证正确,但锁争抢性能很差,为降低锁粒度,可以将热门商品库存拆分,存到多个key中。 2.除了这种方法,可以用原子操作,用incr,decr扣减库存,但如果当前值已经为负数,要考虑将之前扣减的补回来。且为了减少修改,在扣减之前读库存。原子操作库存准确性取决于能否返还之前扣除的库存。但如在服务运行中,返还操作被打断,修正库存很难,因为不知道有多少库存需要修正,只能等活动结束。 而想要完全不丢失库存,习惯性用事务和回滚保证。但外置的库存服务redis不属于数据库缓存范围。所以 很多系统库存故障时不返还 。 3.还有方法是用令牌库存,用redis list。一个令牌是一个库存,没有库存用户只会拿到nil,这只是解决原子操作抢库存失败不用补偿库存的问题,仍有丢库存的情况。 同时brpop命令从list右侧取令牌,如果不需要阻塞,用rpop压测性能更好。 但当库存成千上万,不适合用令牌,如果有十万个库存要连续插入十万个字符串到list中,入库期间会让redis大量卡顿。 4.下面讲一个商品抢多个库存问题。之前的讲商品库存拆分到多个key的方法存在问题。当库存剩最后几个商品时,极端情况要秒杀三件商品,要获取所有key库存,得到两个库存,性能较差。 考虑将所有key合并为一个,改用rpop实现多个库存扣减,即将所有key放入list,取库存前用llen命令(O 1时间复杂度)看库存,用rpop取出三个key,如果数量不够,则用lpush返还。 5.下面讲库存争抢时要操作多个key才能完成争抢问题。这时原子操作不合适,不能保证多个key的一致性。这时可以用自旋互斥锁,但循环抢锁如争抢线程很多等待时间越长。这时可以用CAS乐观锁,先multi命令开启事务,watch命令监控库存修改,然后rpop取key,最后decr扣减库存,然后exec执行之前所有步骤。但multi命令只能保证一个槽内的原子性。 与上面事务加乐观锁类似,可以用lua脚本。

说说hertz和Gin http框架的区别?page 33

hertz底层基于自研网络库netpoll,gin基于go语言net http标准库。

说说Kitex和gRPC微服务框架的区别?page 33

Kitex底层使用基于tcp的自定义协议,支持gRPC协议,也支持thrift序列化协议。

而gRPC底层使用http 2协议,默认用protobuf作为序列化格式。

说说gorm的底层原理。page 33

gorm是go语言orm框架。底层基于go语言database sql标准库,通过反射解析结构体字段名。

讲讲TCC模式做了什么?(讲讲你的项目中try confirm cancel)page 1

try阶段冻结库存或资金。confirm阶段在自己的数据库插入数据,调用其他服务接口,扣款。cancel阶段回滚,将其他服务扣的款加回去。