Back

Diving Deep: How Confluence Manages Your Pages Behind the Scenes

Sep 20 2024
10min
šŸ• Current time : 29 Mar 2025, 05:04 AM
The full Astro logo.

Hey All, tech enthusiasts! Ever wondered how Confluence, that collaborative workspace we all know and love (or love to hate, no judgment here), actually stores all those pages, comments, and cat GIFs you’ve been uploading? Well, grab a coffee and get comfy, because we’re about to take a deep dive into the world of Confluence’s storage system.

The Database Tango

First things first, Confluence isn’t picky about its dance partner when it comes to databases. It’ll happily waltz with PostgreSQL, foxtrot with MySQL, salsa with Oracle, or even do the robot with Microsoft SQL Server. But no matter which DBMS is leading, the dance steps remain pretty similar.

Let’s take a peek at some of the key tables in this database disco:

CREATE TABLE CONTENT (
    ID BIGINT PRIMARY KEY,
    TITLE VARCHAR(255),
    CREATOR_ID BIGINT,
    CREATION_DATE TIMESTAMP,
    LAST_MODIFIER_ID BIGINT,
    LAST_MODIFICATION_DATE TIMESTAMP,
    VERSION_NUMBER INT,
    PARENT_ID BIGINT,
    SPACE_ID BIGINT
);

CREATE TABLE CONTENT_BODY (
    CONTENT_ID BIGINT,
    BODY_VERSION INT,
    BODY CLOB,
    PRIMARY KEY (CONTENT_ID, BODY_VERSION)
);

CREATE TABLE SPACES (
    ID BIGINT PRIMARY KEY,
    NAME VARCHAR(255),
    KEY VARCHAR(255)
);

-- More tables for users, attachments, permissions, etc.

XML: The Secret Sauce

Now, you might be thinking, ā€œWait a minute, are they just dumping HTML into that BODY column?ā€ Well, not exactly. Confluence is a bit fancier than that. It uses its own XML-based format called ā€œConfluence Storage Formatā€. It’s like HTML’s cooler, more complex cousin.

Here’s a little taste of what it looks like:

<ac:structured-macro ac:name="info">
  <ac:rich-text-body>
    <p>This is an info macro. Fancy, huh?</p>
  </ac:rich-text-body>
</ac:structured-macro>

This XML structure allows Confluence to do all sorts of neat tricks with the content, like easily parsing specific elements or updating just parts of a page.

Versioning: Because Everyone Loves a Good Backup

Confluence treats your pages like a historian treats ancient texts - it keeps track of every single change. Each edit creates a new version, stored as a new row in the CONTENT_BODY table. It’s like a time machine for your documents!

The versioning system might look something like this in pseudo-code:


def save_page(content_id, new_body):
    current_version = get_current_version(content_id)
    new_version = current_version + 1
    
    insert_into_content_body(content_id, new_version, new_body)
    update_content_table(content_id, new_version)
    
    if should_create_diff():
        create_and_store_diff(content_id, current_version, new_version)

Attachments: Not Just Stuck On

Attachments in Confluence are like that friend who always brings snacks to the party - everyone loves them, but they need special handling. The metadata (filename, size, who brought the snacks) goes into the database, but the actual file (the snacks themselves) usually gets stored in the file system.

Here’s a simplified look at how that might work:

def save_attachment(page_id, file):
    file_path = generate_unique_path(file.name)
    save_file_to_disk(file, file_path)
    
    metadata = {
        'page_id': page_id,
        'filename': file.name,
        'path': file_path,
        'size': file.size,
        'mime_type': file.mime_type
    }
    
    insert_into_attachments_table(metadata)

The Search Party

Confluence uses Apache Lucene to power its search functionality. It’s like having a really efficient librarian who knows where everything is. This librarian indexes not just the pages, but also attachments and comments.

Here’s a simplistic view of how indexing might work:

public void indexPage(Page page) {
    Document doc = new Document();
    doc.add(new Field("id", page.getId(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    doc.add(new Field("title", page.getTitle(), Field.Store.YES, Field.Index.ANALYZED));
    doc.add(new Field("content", extractText(page.getBody()), Field.Store.NO, Field.Index.ANALYZED));
    
    indexWriter.addDocument(doc);
}

Caching: The Speed Demon

To keep things zippy, Confluence employs various caching strategies. It’s like having a really good short-term memory for frequently accessed stuff.

Here’s a simplified example of how object caching might work:

public Page getPage(Long pageId) {
    Page page = cache.get(pageId);
    if (page == null) {
        page = database.loadPage(pageId);
        cache.put(pageId, page);
    }
    return page;
}

Cloud vs. Server: A Tale of Two Deployments

Confluence comes in two flavors: cloud and server. The cloud version is like ordering pizza delivery - convenient, but you don’t get to see the kitchen. The server version is more like making pizza at home - more control, but you have to clean up the mess.

The cloud version uses a multi-tenant architecture, which is a fancy way of saying it’s like an apartment building where everyone has their own space but shares the overall structure. The server version is more like having your own house - you can paint the walls whatever color you want (as long as your DBA approves).

Bringing It All Together

To wrap our heads around how all these pieces fit together, let’s look at a high-level system diagram:

graph TD
    A[User] -->|Interacts with| B(Web Interface)
    B -->|Requests/Updates| C{Application Server}
    C -->|Queries/Writes| D[(Database)]
    C -->|Reads/Writes| E[File System]
    C -->|Indexes/Searches| F[Search Index]
    C -->|Caches| G[Cache Layer]
    H[Other Atlassian Products] -->|Integrates with| C

This diagram shows how a user’s interaction flows through the system, from the web interface, through the application server, and to various storage and performance optimization components.

In Conclusion

So there you have it, folks! That’s the nitty-gritty of how Confluence keeps track of all your brilliant ideas, project plans, and yes, those cat GIFs. It’s a complex dance of databases, XML, file systems, and clever optimizations.

Next time you hit that ā€œSaveā€ button, spare a thought for all the behind-the-scenes action making sure your content is stored, versioned, searchable, and quickly retrievable. And maybe, just maybe, you’ll appreciate Confluence a little bit more. Or at least, you’ll have some cool tech trivia for your next virtual water cooler chat!

Remember, this is just scratching the surface. Confluence, like any good software system, is always evolving. So who knows? By the time you read this, they might have invented an even fancier way to store your pages. Stay curious, and keep exploring!šŸ’”

Read more in this Series:

Find me on

GitHub LinkedIn LinkedIn X Twitter
© 2022 to 2025 : Amit Prakash