为什么以及何时会选择使用Kafka的Spark流媒体?
假设我有一个系统通过Kafka每秒获得数千条消息.我需要对这些消息应用一些实时分析,并将结果存储在数据库中.
我有两个选择:
创建我自己的工作人员,从Kafka读取消息,运行分析算法并将结果存储在DB中.在Docker时代,只需使用scale命令就可以轻松地在整个集群中扩展此工作程序.我只需要确保我的分区数量等于或大于我的工作者,并且一切都很好并且我有一个真正的并发性.
使用Kafka流输入创建Spark群集.让Spark集群进行分析计算,然后存储结果.
有没有第二种选择是更好的选择?听起来像是一个额外的开销.
apache-kafka apache-spark spark-streaming spark-streaming-kafka
我必须遗漏一些东西,但我在Ruby中编写的每个应用程序似乎都在泄漏一些内存.我使用Ruby MRI 2.3,但我看到与其他版本相同的行为.
每当我编写一个在循环中执行某些操作的测试应用程序时,它就会慢慢泄漏内存.
while true
#do something
sleep 0.1
end
Run Code Online (Sandbox Code Playgroud)
例如,我可以写入数组然后在循环中清理它,或者只发送http post请求.
这只是一个例子,但我有很多这样的例子:
require 'net/http'
require 'json'
require 'openssl'
class Tester
def send_http some_json
begin
@uri = URI('SERVER_URL')
@http = Net::HTTP.new(@uri.host, @uri.port)
@http.use_ssl = true
@http.keep_alive_timeout = 10
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
@http.read_timeout = 30
@req = Net::HTTP::Post.new(@uri.path, 'Content-Type' => 'application/json')
@req.body = some_json.to_json
res = @http.request(@req)
rescue Exception => e
puts e.message
puts e.backtrace.inspect
end
end
def run
while true
some_json = {"name": "My name"}
send_http(some_json)
sleep 0.1
end …Run Code Online (Sandbox Code Playgroud) 我试图了解以下两个选项中哪一个是正确的方法以及原因。
\n\n假设我们有GetHotelInfo(hotel_id)从 Web 到控制器调用的 API。
GetHotelInfo的逻辑是:
\n\nGetHotelPropertyData()(位置、设施\xe2\x80\xa6)GetHotelPrice(hotel_id, dates\xe2\x80\xa6)GetHotelReviews(hotel_id)一旦所有结果返回,处理并合并数据并返回 1 个包含酒店所有相关数据的对象。
\n\n选项1:
\n\n
创建 3 个不同的存储库(HotelPropertyRepo、HotelPriceRepo、\nHotelReviewsRepo)
创建将使用这 3 个存储库并\n返回最终结果的 GetHotelInfo 用例。
选项 2:
\n\n
创建 3 个不同的存储库(HotelPropertyRepo、HotelPriceRepo、\nHotelReviewsRepo)
创建 3 个不同的用例(GetHotelPropertyDataUseCase、\nGetHotelPriceUseCase、GetHotelReviewsUseCase)
创建 GetHotelInfoUseCase 来编排前 3 个\n用例。(它也可以是一个控制器,但是\xe2\x80\x99是一个不同的主题)
让\xe2\x80\x99s 说现在只GetHotelInfo暴露在Web 上,但也许将来我也会暴露一些内部请求。
如果 GetHotelInfo 的实际逻辑不是 3 个端点的组合而是 10 个端点的组合,答案会有所不同吗?
\narchitecture model-view-controller use-case go clean-architecture
我发现很难理解在 Ruby 中使用多个线程插入数组是否安全。
据我了解 Ruby 数组,就像任何其他对象一样不是线程安全的。但这是否意味着插入数组也不安全?
例如,我有以下代码:
arr=[]
threads = []
for i in 1..5
threads << Thread.new do
for j in 1..1000
arr << ((1000 * i) + j)
end
end
end
threads.each(&:join)
puts arr.length
Run Code Online (Sandbox Code Playgroud)
它只旋转 5 个线程,每个线程将 1000 个数字推送到数组中。看起来结果总是一致的,我总是得到数组中 5000 个元素的结果。
那么这样做安全吗?
ruby ×2
apache-kafka ×1
apache-spark ×1
architecture ×1
arrays ×1
go ×1
memory-leaks ×1
use-case ×1