我的浏览记录:10W+TPS高并发场景下的系统设计
2023-04-30 03:39:42
设计高并发场景下的“我的浏览记录”系统
在现代互联网时代,数据已然成为数字经济的命脉。而对于众多企业而言,用户数据更是宝贵的资产。为了提升用户服务和体验,企业需要收集、储存和处理海量数据,其中用户浏览记录便是一类至关重要的数据类型。
用户浏览记录 记录了用户在网站上的系列行为,包括访问页面、停留时长、点击按钮等信息。这些数据可帮助企业深入了解用户兴趣和需求,从而提供更具个性化和关联性的服务。
高并发场景下的挑战
尽管用户浏览记录的重要性毋庸置疑,但其收集和处理也面临着诸多挑战,其中最主要的问题之一便是高并发 。在某些场景下,如大型购物节期间,网站访问量会骤然激增,导致用户浏览记录的数据量瞬间暴增。若系统无法及时处理这些数据,便会引发数据丢失或系统崩溃。
打造高并发“我的浏览记录”系统
为了应对高并发场景,打造一个能够处理 10W+TPS 数据的“我的浏览记录”系统至关重要。在设计过程中,我们需要重点考虑以下四个方面:
1. 数据可靠性
数据可靠性是系统设计的首要准则。在高并发场景下,保证数据的完整性和一致性至关重要。为提升数据可靠性,可采取以下措施:
- 采用分布式数据库: 将数据分散存储于多个节点,即使某一节点发生故障,也能确保数据无损。
- 引入缓存机制: 将常访问的数据缓存在内存中,减少数据库访问次数,提升系统性能和降低数据库负载。
- 数据分片: 将数据分割成不同部分,存储于不同的节点,缓解单节点压力,提升系统并发处理能力。
2. 成本优化
成本是系统设计的另一重要考量因素。在高并发场景下,系统需处理海量数据,可能造成高昂成本。为控制成本,可采取如下策略:
- 选择开源软件: 开源软件一般免费,可节约开支。
- 利用云计算平台: 云平台提供弹性计算资源,可按需调整资源使用量,避免资源浪费。
3. 系统易实现性
高并发场景下的系统实现难度也需纳入考量。处理海量数据可能增加系统实现的复杂性。为降低难度,可采取以下措施:
- 选用成熟技术: 成熟技术经过反复验证,稳定可靠,且实现难度较低。
- 采用模块化设计: 将系统拆分为独立模块,降低系统复杂度,提升可维护性。
4. 读写性能优化
在高并发场景下,系统需要处理大量的读写请求,对系统性能提出严峻挑战。为提升性能,可采取以下方案:
- 部署高性能硬件: 高性能硬件提供更快的运算速度和更高的内存容量,从而提升系统性能。
- 优化算法: 采用优化过的算法可减少系统计算量,提升系统性能。
- 并行处理技术: 将任务分解为多个部分,并行执行,有效提升系统性能。
代码示例
以下为使用 Java 语言实现的示例代码,展示了如何使用分布式数据库和缓存提升数据可靠性和性能:
import com.google.cloud.bigtable.hbase.BigtableConfiguration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.PageFilter;
import org.apache.hadoop.hbase.util.Bytes;
import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.expiry.Duration;
import org.ehcache.expiry.Expirations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/api/browsing-history")
public class BrowsingHistoryController {
private Connection connection;
private Table table;
private CacheManager cacheManager;
private Cache<Long, List<BrowseHistory>> cache;
@Autowired
public BrowsingHistoryController(BigtableConfiguration bigtableConfiguration) throws IOException {
this.connection = bigtableConfiguration.createConnection();
this.table = connection.getTable(TableName.valueOf("browsing-history"));
}
@PostConstruct
public void init() {
cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("browsing-history-cache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, List.class,
ResourcePoolsBuilder.heap(10000))
.withExpiry(Expirations.timeToLiveExpiration(Duration.of(1, TimeUnit.DAYS))))
.build();
cacheManager.init();
cache = cacheManager.getCache("browsing-history-cache", Long.class, List.class);
}
@GetMapping("/{userId}")
public List<BrowseHistory> getBrowsingHistory(@PathVariable Long userId) throws IOException {
List<BrowseHistory> browsingHistory = cache.get(userId);
if (browsingHistory == null) {
Scan scan = new Scan()
.addFamily(Bytes.toBytes("details"))
.setFilter(new PageFilter(1000));
ResultScanner scanner = table.getScanner(scan);
browsingHistory = scanner.stream()
.map(result -> {
long timestamp = result.rawCells()[0].getTimestamp();
String url = Bytes.toString(result.value());
return new BrowseHistory(timestamp, url);
})
.collect(Collectors.toList());
cache.put(userId, browsingHistory);
}
return browsingHistory;
}
}
常见问题解答
1. 如何衡量系统性能?
系统性能可通过以下指标衡量:
- TPS(每秒事务数): 衡量系统处理请求的能力。
- 响应时间: 衡量系统响应请求的延迟。
- 并发用户数: 衡量系统同时处理请求的能力。
2. 数据分片有哪些不同的方法?
数据分片方法包括:
- 哈希分片: 根据数据记录的哈希值将其分配到不同的分区。
- 范围分片: 根据数据记录的特定字段值将其分配到不同的分区。
- 列表分片: 将数据记录均匀分配到不同的分区。
3. 缓存如何帮助提升系统性能?
缓存通过存储频繁访问的数据来减少对数据库的访问次数,从而提高系统性能。
4. 并行处理技术有哪些不同类型?
并行处理技术类型包括:
- 多线程: 在一个进程内并行执行多个任务。
- 多进程: 在多个进程中并行执行任务。
- 分布式计算: 在多台计算机上并行执行任务。
5. 高并发场景下,数据可靠性如何保障?
在高并发场景下,可以通过以下措施保障数据可靠性:
- 分布式数据库: 将数据分散存储于多个节点,即使某一节点发生故障,也能确保数据无损。
- 数据冗余: 在多个节点复制数据,增加数据安全性。
- 事务处理: 采用事务处理机制,确保数据操作的原子性和一致性。