MST

星途 面试题库

面试题:如何在不同应用场景下合理选择MongoDB的writeConcern以平衡性能与数据可靠性

假设你正在开发一个社交类应用,用户发布动态和读取动态都很频繁。对于用户发布动态的写入操作,应如何根据业务需求选择合适的writeConcern来确保数据的可靠性,同时尽量减少对写入性能的影响?请详细说明选择的依据和可能带来的权衡。
46.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

选择合适的writeConcern

  1. 对于社交类应用中用户发布动态的写入操作
    • 可以考虑选择 writeConcern: {w: 1}
  2. 选择依据
    • 性能方面:社交类应用用户发布动态频繁,对写入性能要求较高。writeConcern: {w: 1} 表示只要主节点确认写入成功,就返回给客户端成功响应。这大大减少了等待多个节点确认写入的时间,能够快速响应客户端,提升用户体验,满足高频率发布动态的需求。
    • 可靠性方面:虽然只等待主节点确认,但现代数据库主节点通常有一定的容错机制,并且大多数情况下主节点能够可靠地保存数据。在一些简单场景或对数据可靠性要求不是绝对严格的情况下,这种方式可以在一定程度上保证数据不会轻易丢失。
  3. 可能带来的权衡
    • 可靠性权衡:与更高的 w 值(如 w: majority)相比,w: 1 的可靠性相对较低。如果主节点在确认写入后但还未将数据复制到其他节点时发生故障,可能会导致数据丢失。不过,在社交类应用场景中,用户动态数据的丢失概率相对可接受,因为社交数据并非如金融数据等对绝对不丢失要求那么高。
    • 性能权衡:如果选择更高的 w 值,如 w: majority,虽然能极大提升数据可靠性,确保数据在大多数节点上保存后才返回成功,但会显著增加写入延迟。因为需要等待多个节点确认写入,这在高并发写入(如社交应用中用户频繁发布动态)场景下,可能导致写入性能下降,用户等待时间变长,影响用户体验。而 writeConcern: {w: 1} 则通过牺牲部分可靠性换取了更好的写入性能。