Activity is the core data in Stream Framework; their implementation follows the activitystream schema specification. An activity in Stream Framework is composed by an actor, a verb and an object; for example: “Geraldine posted a photo”. The data stored in activities can be extended if necessary; depending on how you use Stream Framework you might want to store some extra information or not. Here is a few good rule of thumbs to follow in case you are not sure wether some information should be stored in Stream Framework:
- Add a field used to perform aggregation (eg. object category)
- You want to keep every piece of information needed to work with activities in Stream Framework (eg. avoid database lookups)
- The data stored in the activity gets updated
- The data requires lot of storage
Activity storage strategies¶
Activities are stored on Stream Framework trying to maximise the benefits of the storage backend used.
When using the redis backend Stream Framework will keep data denormalized; activities are stored in a special storage (activity storage) and user feeds only keeps a reference (activity_id / serialization_id). This allow Stream Framework to keep the (expensive) memory usage as low as possible.
When using Cassandra as storage Stream Framework will denormalize activities; there is not an activity storage but instead every user feed will keep the complete activity. Doing so allow Stream Framework to minimise the amount of Cassandra nodes to query when retrieving data or writing to feeds.
In both storages activities are always stored in feeds sorted by their creation time (aka Activity.serialization_id).
Extend the activity class¶
New in version 0.10.0.
You can subclass the activity model to add your own methods. After you’ve created your own activity model you need to hook it up to the feed. An example follows below
from stream_framework.activity import Activity # subclass the activity object class CustomActivity(Activity): def mymethod(): pass # hookup the custom activity object to the Redis feed class CustomFeed(RedisFeed): activity_class = CustomActivity
For aggregated feeds you can customize both the activity and the aggregated activity object. You can give this a try like this
from stream_framework.activity import AggregatedActivity # define the custom aggregated activity class CustomAggregated(AggregatedActivity): pass # hook the custom classes up to the feed class RedisCustomAggregatedFeed(RedisAggregatedFeed): activity_class = CustomActivity aggregated_activity_class = CustomAggregated