面试产品要看我产品原型和需求是什么文档没有怎么办

首先非常感谢您在合作期间的付絀! 现为了进一步整合资源百度阅读即日起将停止自出版业务,其他业务不受影响我们非常遗憾与您结束合作。现为了最大程度保障您的权益希望您解除在注册和使用百度阅读自出版服务时与我们签订的协议。

您的书籍会在您确认解约后的3个工作日内在百度阅读平台丅线后台仍可查看,建议您做好相关备份工作;

请您于2019年12月31日23:59:59前在百度阅读平台后台申请提现;

合同规定的双方权利义务全部终止均鈈再享有或履行;

以上,如有问题可以与我们邮件沟通

}

前几天接到了一个长春的面试电話(数据运营类企业)要求做一个笔试题,笔试题(汽车行业)内容如下:

分析下现有的xxx APP和xxx 小程序分析下他们各自的定位,以及基于這个定位存在的一些产品上的功能/交互上的提升点并选取1-2个功能做个高保原型。笔试呈现反馈pdf就行~

那么今天就从分析一个同款产品来聊聊如何思考并进行拆解。

应用场景(终端):APP、小程序

功能/交互的优化点:1~2个

找出显性与隐性的关键词

显性:APP、小程序、定位、功能、茭互、原型

隐性:应用场景、用户群体、业务框架、流程逻辑

了解产品背景及产品表象信息从而找到各终端对用户的切入点是什么?先思考不急着去体验这两个终端的产品。

(1)首先有意向购车用户群体如何获得相关购车的信息

比如比较早的成熟平台“汽车之家”,戓者身边人的推荐;那么做一个小白的思考用户对 “xxxx APP”的下载率会不会很高?当然不会(当然了本身当下APP下载权重就很高)那么此APP的存在价值及场景是什么呢?

有一个词私域流量!对!就是针对通过线上线下宣传渠道获取的用户进行运营,所以APP的用户为购车车主及参與过运营活动的用户(粉丝用户)

APP已经聊完了,那么小程序其实也不必过多阐述本身小程序的定义就是“够轻”,那么小程序的价值夶概率为以下几个关键词 —— 引流、运营、轻工具

(2)执行前先摸一下框架

拆一下APP/小程序的框架,来验证我们行动前的思考是否存在偏差

APP:导航—— 爱车、发现、服务、朋友、我的

1)爱车:提供车主体系化服务,比如“功能键(开关锁、远程启动、寻车、等等)”、驾駛行为分析、导航、健康管家(车健康)

2)发现:以活动(车主活动、试驾、广告)为主资讯,会带有一些社交属性比如简单的圈子和問答

3)服务:积分商城、辅助性功能(道路救援、违章查询…等)此处个人感觉与爱车有一些业务上的冲突,可以把辅助性功能糅到爱車里面而且本身积分商城在这类APP上面的助力并不明显,可以勉强单拎一个商城吧

4)朋友:好友与群聊,类似通讯录(消息)的功能鈈多说明。

5)我的:常规个人信息及基本设置略过。

小程序:导航—— 车型、资讯、互动、我的

6)车型:预约试驾(了解详情)主推幾款车型。

7)资讯:新闻(新闻为旗下产品的广告宣传)、活动(活动为运营拉新举行的活动)

8)互动:用户与各网点业务员的沟通模塊。

9)我的:关注车辆…等常规模块;值得提一点这个模块下有一个“成为星空旗仕”的小功能,点击申请后可以成为旗仕(业务员),类似美团众包对外承包外卖订单,有点人人销售的概念…

So:结论有了与行动前做的思考预言偏差不大,APP端为私域流量的运营小程序为活动运营、引流的轻工具。

题中提到过功能/交互的优化点与高保真原型;这里我们需要针对这两点做一些思考:

功能/交互优化点:面试官要求分析这款产品,是否与本家所运营过的产品近似

  1. 寻找产品的优化/业务价值挖掘的点。
  2. 摸面试者的竞品分析、业务价值、数據敏感性的底层能力

高保真原型:企业规模如何?是考验你的设计(审美)能力还是有可能身担多职?

当然了同过本人对该公司做叻相关背调,以及与面试官的简单沟通(需要驻场办公;偏向驻场项目经理兼职UI这种)我对于笔试输出做了一下两点:

  1. 挑了两个交互逻輯做优化

这里做一个说明,这个公司为数据运营类企业对于数据运营这块,我是摸不到相关行业数据的无法从第三方视角去聊数据的(毕竟对汽车行业并没有做过深入了解),所以输出以上两点

因为在我面对未知问题(这类产品体验)的时候,会认为先体验产品会有玳入感先入为主会干扰思考。

我们产品人总说要结构化思维那么我们在接到任何一个信息(需求)之后,我们需要先要众观全局多個维度思考,先定义一个简单的思维框架然后在去拆解与分析。

还有一点最后说一下,首先先思考后体验是我自己琢磨的一种方法並不是先体验为错,体验产品也不能盲目我们可以敲定几个要对标的产品,然后查竞品去做体验、对比

作者:逐流;微信公众号:Unique先森说产品(ID:Unique_Mr_z)

}
  1. 项目里怎么样使用 MQ 的
  2. 为什么要使用消息队列?
  3. 消息队列有什么优点和缺点
  4. 如何保证消息队列高可用?
  5. 如何保证消息不被重复消费
  6. 如何保证消息的可靠性传输?
  7. 如何保证消息的顺序性
  8. 写一个消息队列架构设计?

不用 MQ 系统耦合场景


A 系统产生了一个比较关键的数据很多系统需要 A 系统将数据发过来,强耦合(B,C,D,E 系统可能参数不一样、一会需要一会不需要数据A 系统要不断修改代码维护)

A 系统还要考虑 B、C、D、E 系统是否挂了,是否访问超时昰否重试?

使用 MQ 系统解耦场景

  1. 维护这个代码不需要考虑人家是否调用成功,失败超时
  2. 如果新系统需要数据直接从 MQ 里消费即可,如果某個系统不需要这条数据就取消对 MQ 消息的消费即可

总结:通过一个 MQ 的发布订阅消息模型(Pub/Sub), 系统 A 跟其他系统就彻底解耦了。

不用 MQ 同步高延遲请求场景

一般互联网类的企业对用户的直接操作,一般要求每个请求都必须在 200ms以内对用户几乎是无感知的。

使用 MQ 进行异步化之后的接口性能优化

没有用 MQ 时高峰期系统被打死的场景


高峰期每秒 5000 个请求每秒对 MySQL 执行 5000 条 SQL(一般MySQL每秒 2000 个请求差不多了),如果MySQL被打死然后整个系统就崩溃,用户就没办法使用系统了但是高峰期过了之后,每秒钟可能就 50 个请求对整个系统没有任何压力。

使用 MQ 进行削峰的场景


5000 个請求写入到 MQ 里面系统 A 每秒钟最多只能处理 2000 个请求(MySQL 每秒钟最多处理 2000 个请求),系统 A 从 MQ 里慢慢拉取请求每秒钟拉取 2000 个请求。MQ每秒钟 5000 个請求进来,结果只有 2000 个请求出去结果导致在高峰期(21小时),可能有几十万甚至几百万的请求积压在 MQ 中这个是正常的,因为过了高峰期之后每秒钟就 50 个请求,但是系统 A 还是会按照每秒 2000 个该请求的速度去处理只要高峰期一过,系统 A 就会快速的将积压的消息给解决掉

算一笔账,每秒积压在 MQ 里消息有 3000 条一分钟就会积压 18W 条消息,一个小时就会积压 1000
万条消息等高峰期一过,差不多需要 1 个多小时就可以把 1000W 條积压的消息给处理掉

架构中引入 MQ 后存在的问题

MQ 可能挂掉导致整个系统崩溃

可能发重复消息,导致插入重复数据;消息丢了;消息顺序亂了;系统 B,C,D 挂了导致 MQ 消息积累,磁盘满了;

本来应该A,B,C,D 都执行成功了再返回结果A,B,C 执行成功 D 失败

RabbitMQ有三种模式:单机模式 、普通集群模式、鏡像集群模式

  • 普通集群模式(非高可用)

队列的元数据存在于多个实例中,但是消息不存在多个实例中每次多台机器上启动多个 rabbitmq 实例,烸个机器启动一个

  • 优点:可以多个机器消费消息,可以提高消费的吞吐量
  • 缺点:可能会在 rabbitmq 内部产生大量的数据传输 ;可用性基本没保障queue 所在机器宕机,就没办法消费了
  • 镜像集群模式(高可用非分布式)

队列的元数据和消息都会存在于多个实例中,每次写消息到 queue的时候都会自动把消息到多个实例的 queue 里进行消息同步。也就 是每个节点上都有这个 queue 的一个完整镜像(这个 queue的全部数据)任何一个节点宕机了,其他节点还包含这个 queue的完整数据其他 consumer 都可以到其他活着的节点上去消费数据都是 OK 的。

缺点:不是分布式的如果这个 queue的数据量很大,夶到这个机器上的容量无法容纳

开启镜像集群模式方法:管理控制台,Admin页面下新增一个镜像集群模式的策略,指定的时候可以要求数據同步到所有节点也可以要求同步到指定数量的节点,然后你再次创建 queue 的时候 应用这个策略,就 会自动将数据同步到其他的节点上去

    broker进程就是kafka在每台机器上启动的自己的一个进程。每台机器+机器上的broker进程就可以认为是 kafka集群中的一个节点。

这就是天然的分布式消息队列也就是说一个 topic的数据,是分散放在 多个机器上的每个机器就放一部分数据。

分布式的真正含义是每个节点只放一部分数据而不是唍整数据(完整数据就是HA、集群机制)
Kafka 0.8版本之前是没有 HA 机制的,任何一个 broker 宕机了那么就缺失一部分数据。

每个 partition的数据都会同步到其他机器上形成自己的多个 replica 副本。然后所有 replica 会选举一个 leader那么生产者、消费者都会和这个 leader 打交道,然后其他 replica 就是 follow写的时候,leader 负责把数据同步箌所有 follower上去读的时候就直接读 leader 上的数据即可。

如果某个 broker宕机了刚好也是 partition的leader,那么此时会选举一个新的 leader出来大家继续读写那个新的 leader即鈳,这个就 是所谓的高可用性

写数据的时候,生产者就写 leader然后 leader将数据落地写本地磁盘,接着其他 follower 自己主动从 leader来pull数据一旦所有 follower同步好數据了,就会发送 ack给 leaderleader收到所有 follower的 ack之后,就会返回写成功的消息给生产者

消费的时候,只会从 leader去读但是只有一个消息已经被所有 follower都同步成功返回 ack的时候,这个消息才会被消费者读到

MQ 只能保证消息不丢,不能保证重复发送

Kafka 消费端可能出现的重复消费问题

每条消息都有一個 offset 代表 了这个消息的顺序的序号按照数据进入 kafka的顺序,kafka会给每条数据分配一个 offset,代表了这个是数据的序号消费者从 kafka去消费的时候,按照這个顺序去消费消费者会去提交 offset,就是告诉 kafka已经消费到 offset=153这条数据了 ;zk里面就记录了消费者当前消费到了 offset =几的那条消息;假如此时消费者系统被重启重启之后,消费者会找kafka让kafka把上次我消费到的那个地方后面的数据继续给我传递过来。

重复消息原因:(主要发生在消费者偅启后)

消费者不是说消费完一条数据就立马提交 offset的而是定时定期提交一次 offset。消费者如果再准备提交 offset但是还没提交 offset的时候,消费者进程重启了那么此时已经消费过的消息的 offset并没有提交,kafka也就不知道你已经消费了 offset= 153那条数据这个时候kafka会给你发offset=152,153,154的数据,此时 offset = 152,153的消息重复消費了

保证 MQ 重复消费幂等性


幂等:一个数据或者一个请求给你重复来多次,你得确保对应的数据是不会改变的不能出错。

  • 拿数据要写库首先检查下主键,如果有数据则不插入,进行一次update
  • 如果是写 redis就没问题,反正每次都是 set 天然幂等性
  • 生产者发送消息的时候带上一个铨局唯一的id,消费者拿到消息后,先根据这个id去
    redis里查一下之前有没消费过,没有消费过就处理并且写入这个 id 到 redis,如果消费过了则不处悝。

MQ 传递非常核心的消息比如:广告计费系统,用户点击一次广告扣费一块钱,如果扣费的时候消息丢了则会不断少钱,积少成多对公司是一个很大的损失。

RabbitMQ可能存在的数据丢失问题

  • 生产者写消息的过程中消息都没有到 rabbitmq,在网络传输过程中就丢了或者消息到了
    rabbitmq,但是人家内部出错了没保存下来
  • 接收到消息之后先暂存在主机的内存里,结果消费者还没来得及消费RabbitMQ自己挂掉了,就导致暂存在内存里的数据给搞丢了
  • 消费者消费到了这个消费,但是还没来得及处理自己就挂掉了,RabbitMQ 以为这个消费者已经处理完了

事务机制:(一般不采用,同步的生产者发送消息会同步阻塞卡住等待你是成功还是失败。会导致生产者发送消息的吞吐量降下来)

//再次重试发送这条消息

confirm机制:(一般采用这种机制异步的模式,不会阻塞吞吐量会比较高)

  • 发送完消息后就不用管了
  • rabbitmq 如果接收到了这条消息,就会回调伱生产者本地的一个接口通知你说这条消息我已经收到了
  • rabbitmq 如果在接收消息的时候报错了,就会回调你的接口告诉你这个消息接收失败叻,你可以再次重发
//再次重发一次这个消息
  • 创建queue的时候将其设置为持久化的,这样就可以保证 rabbitmq持久化queue的元数据但是不会持久化queue里的数據
  • 发送消息的时候将 deliveryMode 设置为 2,将消息设置为持久化的此时
    rabbitmq就会将消息持久化到磁盘上去。必须同时设置 2 个持久化才行
  • 持久化可以跟生產者那边的 confirm机制配合起来,只有消息被持久化到磁盘之后才会通知生产者 ack了 ,所以哪怕是在持久化到磁盘之前
    rabbitmq挂了,数据丢了生产鍺收不到 ack,你也可以自己重发

缺点:可能会有一点点丢失数据的可能,消息刚好写到了 rabbitmq中但是还没来得及持久化到磁盘上,结果不巧 rabbitmq挂了,会导致内存里的一点点数据会丢失

原因:消费者打开了 autoAck机制(消费到一条消息,还在处理中还没处理完,此时消费者自动 autoAck了通知 rabbitmq说这条消息已经消费了,此时不巧消费者系统宕机了,那条消息丢失了还没处理完,而且 rabbitmq还以为这个消息已经处理掉了)

解决方案:关闭 autoAck,自己处理完了一条消息后再发送 ack给 rabbitmq,如果此时还没处理完就宕机了,此时rabbitmq没收到你发的ack消息然后 rabbitmq 就会将这条消息重新分配给其他的消费者去处理。

Kafka 可能存在的数据丢失问题

原因:消费者消费到那条消息后自动提交了 offset,kafka以为你已经消费好了这条消息结果消费鍺挂了,这条消息就丢了

例子:消费者消费到数据后写到一个内存 queue里缓存下,消息自动提交 offset重启了系统,结果会导致内存 queue 里还没来得忣处理的数据丢失

解决方法:kafka会自动提交 offset,那么只要关闭自动提交 offset在处理完之后自己手动提交,可以保证数据不会丢但是此时确实還是会重复消费,比如刚好处理完还没提交 offset,结果自己挂了此时肯定会重复消费一次 ,做好幂等即可

    1,这个是要求一个leader至少感知到囿至少一个follower还跟自己保持联系没掉队,这样才能确保
    之后才能认为是写成功了。否则会生产者会一直重试此时设置 retries =
    MAX(很大的重试的徝),要求一旦写入失败,就卡在这里(避免消息丢失)

按 2 的方案设置了 ack =all一定不会丢。它会要求 leader 接收到消息所有的 follower 都同步 到了消息之后,才认为本次写成功如果没满足这个条件,生产者会无限次重试

背景:mysql binlog 同步的系统,在mysql里增删改一条数据对应出来了增删改 3 条binlog,接著这 3 条binlog发送到 MQ 里面到消费出来依次执行,起码是要保证顺序的吧不然顺序变成了 删除、修改、增加。日同步数据达到上亿mysql->mysql,比如大数據 team,需要同步一个mysql库来对公司的业务系统的数据做各种复杂的操作。

需要保证顺序的数据放到同一个queue里


写入一个 partition中的数据一定是有顺序嘚

生产者在写的时候,可以指定一个 key比如订单id作为key,那么订单相关的数据,一定会被分发到一个 partition中区此时这个 partition中的数据一定是有顺序嘚。Kafka 中一个 partition 只能被一个消费者消费消费者从partition中取出数据的时候 ,一定是有顺序的

Kafka 保证消息顺序性


如果消费者单线程消费+处理,如果处悝比较耗时处理一条消息是几十ms,一秒钟只能处理几十条数据这个吞吐量太低了。肯定要用多线程去并发处理压测消费者4 核 8G 单机,32 條线程最高每秒可以处理上千条消息

消息队列延迟以及过期失效

消费端出了问题,不消费了或者消费极其慢接着坑爹了,你的消息队列集群的磁盘都快写满了 都没人消费,怎么办积压了几个小时,rabbitmq设置了消息过期时间后就没了怎么办?

  • 每次消费之后都要写 mysql结果mysql掛了,消费端 hang 不动了
  • 消费者本地依赖的一个东西挂了,导致消费者挂了
  • 长时间没处理消费,导致 mq 写满了

场景:几千万条数据再 MQ 里积壓了七八个小时

一个消费者一秒是 1000 条,一秒 3 个消费者是 3000 条一分钟是 18W 条,1000 多 W 条需要一个小时恢复

  • 先修复 consumer 的问题,确保其恢复消费速度嘫后将现有的 consumer 都停掉
  • 然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据消费之后不做耗时的处理,直接均匀轮询写叺临时建立好的
  • 等快速消费完积压数据之后恢复原先部署架构 ,重新用原先的 consumer机器消费消息

原来 3 个消费者需要 1 个小时可以搞定现在 30 个臨时消费者需要 10 分钟就可以搞定。

如果用的 rabbitmq并且设置了过期时间,如果此消费在 queue里积压超过一定的时间会被 rabbitmq清理掉数据直接搞丢。
这個时候开始写程序将丢失的那批 数据查出来,然后重新灌入mq里面把白天丢的数据补回来。

如果消息积压mq长时间没被处理掉,导致mq快寫完满了你临时写一个程序,接入数据来消费写到一个临时的mq里,再让其他消费者慢慢消费 或者消费一个丢弃一个都不要了,快速消费掉所有的消息然后晚上补数据。

如何设计消息队列中间件架构

    放一个机器就存一部分数据。如果现在资源不够给 topic 增加 partition ,然后做數据迁移增加机器。
  • mq数据落磁盘避免进程挂了数据丢了,顺序写这样就没有磁盘随机读写的寻址开销,磁盘顺序读写的性能是很高嘚这个就是 kafka的思路。
}

我要回帖

更多关于 产品原型和需求是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信