面试题答案
一键面试分布式框架选择
这里选择使用 DRb
(分布式Ruby)框架,它允许Ruby程序在网络上的不同进程间进行通信。原理是通过将对象暴露在网络上,其他进程可以通过网络调用这些对象的方法,实现分布式计算。
性能优化策略
- 数据分块读取:避免一次性读取整个1GB的日志文件,而是分块读取,减少内存占用。
- 并行处理:利用多线程或多进程并行处理不同节点上的日志文件,充分利用多核CPU资源。
- 数据缓存:对于频繁访问的数据(如IP地址统计结果),使用缓存机制减少重复计算。
核心实现代码
- 服务端代码(负责提供数据处理服务)
require 'drb'
class LogProcessor
def process_log(log_path)
ip_count = {}
File.foreach(log_path) do |line|
# 假设IP地址在日志行中的第3个字段
ip = line.split(' ')[2]
ip_count[ip] ||= 0
ip_count[ip] += 1
end
ip_count
end
end
DRb.start_service('druby://0.0.0.0:8787', LogProcessor.new)
DRb.thread.join
- 客户端代码(负责调度任务)
require 'drb'
DRb.start_service
log_processor = DRbObject.new_with_uri('druby://server_ip:8787')
log_files = [
'path/to/log1.log', 'path/to/log2.log',
# 这里列出100个日志文件路径
]
results = []
threads = log_files.map do |log_file|
Thread.new do
result = log_processor.process_log(log_file)
results << result
end
end
threads.each(&:join)
final_ip_count = {}
results.each do |ip_count|
ip_count.each do |ip, count|
final_ip_count[ip] ||= 0
final_ip_count[ip] += count
end
end
puts final_ip_count
在上述代码中,服务端定义了一个 LogProcessor
类,其中的 process_log
方法负责从单个日志文件中提取IP地址并统计其出现次数。客户端通过DRb连接到服务端,并行调度每个日志文件的处理任务,最后汇总所有结果得到总的IP地址统计。