canvas-lms/gems/broadcast_policy
Jon Jensen f005ba96a0 broadcast policy perf improvements, fixes SD-2130
don't create extra AR objects or incur unnecessary write_attribute taxes
(super expensive for serialized columns). this speeds up saving any AR
model that has a broadcast policy (whether or not messages are sent), in
particular ones having serialized columns (e.g. quiz submissions), since
we avoid an unnecessary type cast on each attribute.

while it's a little hard to quantify the perf boost we'll see in the app,
here is a sampling of numbers we see in the specs:

 spec/messages :
   0:48 -> 0:45 (6.6% reduction)
 spec/models/a* :
   5:59 -> 5:17 (12% reduction)
 spec/selenium/grades/speedgrader
   14:09 -> 13:13 (6.7% reduction),
     slowest spec went from 0:26 -> 0:19

speed gains in the app will likely be more modest, but performance should
noticeably improve in places like the speedgrader (e.g. grade quiz by
question)

test plan:
* specs
* regression test of notifications throughout the app, in particular:
  * discussion topics
  * assignments
  * submissions

Change-Id: I1ccf6f7f293a35763fde077d612505069823390e
Reviewed-on: https://gerrit.instructure.com/102868
Reviewed-by: Landon Wilkins <lwilkins@instructure.com>
Reviewed-by: Cody Cutrer <cody@instructure.com>
Tested-by: Jenkins
QA-Review: Cemal Aktas <caktas@instructure.com>
Product-Review: Jon Jensen <jon@instructure.com>
2017-03-01 20:42:36 +00:00
..
lib broadcast policy perf improvements, fixes SD-2130 2017-03-01 20:42:36 +00:00
spec broadcast policy perf improvements, fixes SD-2130 2017-03-01 20:42:36 +00:00
.rspec-local gemify broadcast policy 2014-09-24 11:35:33 +00:00
Gemfile gemify broadcast policy 2014-09-24 11:35:33 +00:00
README.md Support class reloading with BroadcastPolicy 2016-02-11 11:08:17 -05:00
broadcast_policy.gemspec upgrade many canvas gems to rspec 3 syntax 2016-12-27 18:44:23 +00:00
test.sh simplify gem test harnesses 2016-01-19 17:52:58 +00:00

README.md

BroadcastPolicy

This allows us to do something like:

class Model < ActiveRecord::Base has_a_broadcast_policy

set_broadcast_policy do |p| p.dispatch :notification_name p.to { some_endpoints } p.whenever { |record| record.foo_is_true? && record.bar_is_false? } end

end

Usage

In order to use the gem in Rails, you'll need an initializer something like this:

config/initializers/broadcast_policy.rb

require 'broadcast_policy' Rails.configuration.to_prepare do BroadcastPolicy.notifier = lambda { Notifier.new } BroadcastPolicy.notification_finder = lambda { NotificationFinder.new(Notification.all_cached) } end ActiveRecord::Base.send(:extend, BroadcastPolicy::ClassMethods)

The two BroadcastPolicy services are necessary to supply the canvas domain objects for integrating with the notification system License

Copyright (C) 2014 Instructure, Inc.

This file is part of Canvas.

Canvas is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License.

Canvas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses/.