Tag: 并发

ActiveRecord:处理工人之间的DB比赛

我有一个运行在PostgreSQL 9.0之上的Rails 3项目。 使用案例:用户可以按名称请求关注Artists 。 为此,他们向REST资源提交名称列表。 如果我在本地集合中找不到名称的Artist ,请查阅last.fm以获取有关它们的信息,并在本地缓存该信息。 此过程可能需要一些时间,因此会将其委派给名为IndexArtistJob的后台作业。 问题 : IndexArtistJob将并行运行。 因此,两个用户可能同时请求添加相同的Artist 。 两个用户都应该将Artist添加到他们的集合中,但只有一个Artist应该在本地数据库中结束。 Artist模型的相关部分是: require ‘services/lastfm’ class Artist false def self.lookup(name) artist = Artist.find_by_name(name) return artist if not artist.nil? info = LastFM.get_artist_info(name) return if info.nil? # Check local DB again for corrected name. if name.downcase != info.name.downcase artist = Artist.find_by_name(info.name) return artist if […]

如何在应用程序的其余部分继续运行时让控制器等待延迟作业?

(这个问题是如何处理Rails应用程序的长请求以便其他用户不会延迟过多的后续问题? ) 用户向我的Rails应用程序提交答案,并在后端检查最多10秒。 这会导致所有其他用户的延迟,所以我正在尝试使用delayed_job gem将检查移动到Worker进程。 Worker代码将结果返回给控制器。 但是,控制器没有意识到应该耐心等待结果,因此会导致错误。 如何让控制器等待结果并让应用程序的其余部分同时处理简单的请求? 在Javascript中,可以使用回调来调用函数而不是返回值。 我应该在Ruby中做同样的事情并从Worker回调控制器吗? 更新: 或者,如何从Worker调用控制器方法? 然后我可以在完成后调用相关的操作。 这是相关代码: 控制器: def submit question = Question.find params[:question] user_answer = params[:user_answer] @result, @other_stuff = SubmitWorker.new.check(question, user_answer) render_ajax end submit_worker.rb: class SubmitWorker def check #lots of code… end handle_asynchronously :check end

没有SQL查询的Web应用程序用于当前用户身份验

我有一个每秒钟有很多请求的Web服务器。 为了优化数据库的I / O性能,服务器当前只通过HTTP查询执行2个SQL查询: 有一个查询以获取当前用户, 有一个查询来读取或写入资源。 我现在想知道在会话变量中缓存当前用户的id是否也不聪明。 这样,服务器只能通过HTTP查询执行1个SQL查询。 为此,客户端必须在应用程序上进行身份validation。 然后,在检查用户名+密码的SQL查询之后,服务器可以将其id保存在会话变量中。 在此之后,我们可以删除无用的SQL查询。 因为这看起来非常简单,有用,我想知道为什么流行的身份validation插件,如Devise gem(对于Rails或Sinatra)似乎不会这样工作。 他们是最好的方式吗? 你有什么想法? 谢谢你的任何想法。

如何在本地测试并发?

什么是在本地测试并发的最佳方法? 即我想测试10个并发命中。 我知道像Blitz这样的服务。 但是,我试图在本地找到一种更简单的方法来测试竞争条件。 有任何想法吗? 通过curl可能吗?

设置Sidekiq:Heroku上的并发

我无法弄清楚Heroku上的并发是如何工作的,以及如何设置最佳:concurrency Sidekiq的:concurrency值 这是设置 – Puma Web Server 2 workers 5 threads Heroku Dynos 8 web dynos 2 “worker” dynos (These will run Sidekiq, not to be confused with Puma Workers) DB Connections 120 Max Connections Allowed by Postgres 5 Active Record Pool Size (default) ?? Sidekiq :concurrency value 每个Puma工作者都可以使用默认的5个ActiveRecord DB连接(这对于每个有5个线程的连接很好)。 由于每个Web Dyno中有2个这样的Puma工作者,因此每个Web Dyno最多可以使用10个连接。 在所有8个Web dynos中,它们占用了80个连接 […]

rails – 实现一个简单的锁,以防止用户同时编辑相同的数据

我有一个应用程序,我需要阻止用户在由其他用户编辑数据时编辑数据。 我正在考虑最好的方法,并想要提出想法。 到目前为止,我已经创建了一个设置模型,用于在键/值对中存储db上的应用程序范围配置。 所以,对于锁,我有一个名为LOCKED_TABLE_UID的设置实例,它存储了编辑表的用户的user_id,如果表是空的,则为null(nil)。 >> lock = Setting.find_by_key(‘LOCKED_TABLE_UID’) 然后,我在我的应用程序控制器中实现了2个方法来获取和释放锁: # current_user returns the user currently logged in def acquire_lock lock = Setting.find_by_key(“LOCKED_TABLE_UID”) if lock.value # if lock taken, see if it’s the current_user or someone else if lock.value.to_i == current_user.id.to_i return true else return false end else # lock is free, assign it to this […]

如何处理Rails应用程序的长请求,以便其他用户不会延迟太多?

我在Heroku的免费套餐上有一个Rails应用程序,它最近开始吸引一些用户。 我的应用中的一个事件涉及查询另一个API,最多可能需要10秒才能完成。 如何确保同时访问简单页面的其他用户(作为另一个用户的API事件)不需要等待10秒才能加载其页面? 我需要支付更多的Dynos费用吗? 这是可以用delayed_job gem解决的吗? 另一台主机(如AppFog或OpenShift)是否能够更快地处理同步请求? 更新: 此问题建议手动处理线程而不是使用delayed_job。

咨询锁或NOWAIT以避免等待锁定的行?

在我的Rails 4应用程序中,我对Postgres 9.4数据库进行了此查询: @chosen_opportunity = Opportunity.find_by_sql( ” UPDATE \”opportunities\” s SET opportunity_available = false FROM ( SELECT \”opportunities\”.* FROM \”opportunities\” WHERE ( deal_id = #{@deal.id} AND opportunity_available = true AND pg_try_advisory_xact_lock(id) ) LIMIT 1 FOR UPDATE ) sub WHERE s.id = sub.id RETURNING sub.prize_id, sub.id” ) 非常受dba.SE相关答案的启发 。 我只是希望我的查询找到并更新第一个(随机,带LIMIT )行,其中available = true并将其更新为available = false ,我需要在执行此操作时锁定该行,但不要让新请求等待发布之前的锁定,因为有许多并发调用将使用此查询。 […]

将pg_try_advisory_xact_lock()放在嵌套的子查询中?

在我的Ruby on Rails 4应用程序中,我对Postgres 9.4数据库进行了此查询: @chosen_opportunity = Opportunity.find_by_sql( ” UPDATE \”opportunities\” s SET opportunity_available = false FROM ( SELECT \”opportunities\”.* FROM \”opportunities\” WHERE ( deal_id = #{@deal.id} AND opportunity_available = true AND pg_try_advisory_xact_lock(id) ) LIMIT 1 FOR UPDATE ) sub WHERE s.id = sub.id RETURNING sub.prize_id, sub.id” ) 非常受dba.SE相关答案的启发 。 但是这里( Postgres pg_try_advisory_lock会阻止所有记录 )他们说,如果我没弄错的话,我不应该在WHERE子句中使用pg_try_advisory_lock() ,因为我会在扫描的整个集合中每行调用一次 […]

为什么我使用赛璐珞会得到随机错误?

我需要对Web服务进行API调用才能检索日期。 为此我创建了一个样本以熟悉赛璐珞。 在这里,我将使用openweather API进行“培训”。 最终目标是同时运行多个请求。 我的预订类(booking.rb)获取数据 require ‘celluloid’ require ‘open-uri’ require ‘json’ class Booking include Celluloid def initialize end def parse(url) p “back again” begin buffer = open(url).read p JSON.parse(buffer)[‘cod’] rescue => e “fuck” end end end 这就是我运行它的方式: require ‘celluloid’ Celluloid.shutdown_timeout = 10 begin pool = Booking.pool %W( http://api.openweathermap.org/data/2.5/weather?q=London,uk http://api.openweathermap.org/data/2.5/weather?q=Berlin,de http://api.openweathermap.org/data/2.5/weather?q=Munich,de http://api.openweathermap.org/data/2.5/weather?q=Munich,de http://api.openweathermap.org/data/2.5/weather?q=Munich,de http://api.openweathermap.org/data/2.5/weather?q=Munich,de http://api.openweathermap.org/data/2.5/weather?q=Munich,de […]